Skip to content

Commit

Permalink
help v8 optimize
Browse files Browse the repository at this point in the history
  • Loading branch information
alanszlosek committed Jun 8, 2016
1 parent 705bb97 commit fb98688
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 82 deletions.
7 changes: 6 additions & 1 deletion client-worker.js
Expand Up @@ -50,7 +50,12 @@ var worker = {
neededChunks: {},

emit: function(name, data) {
postMessage(Array.prototype.slice.apply(arguments));
var len = arguments.length;
var args = new Array(len);
for (var i = 0; i < len; i++) {
args[i] = arguments[i];
}
postMessage(args);
},


Expand Down
138 changes: 68 additions & 70 deletions lib/client.js
Expand Up @@ -28,80 +28,78 @@ function Client(settings) {
// Listen for certain events/data from the server
Client.prototype.bindEvents = function() {
var self = this;
var messageHandlers = {
open: function() {
self.connected = true;
if (debug) {
log('Client.bindEvents: connection opened');
}
self.emitter.emit('open');
},
close: function() {
self.connected = false;
if (debug) {
log('Client.bindEvents: connection closed');
}
self.emitter.emit('close');
},
error: function(message) {
log('Client.bindEvents.error: ' + message);
},
settings: function(settings, id) {
// merge settings from server into those from the client side
// TODO: fix this for new engine setup
//self.settings = extend(self.settings, settings) // server settings squash client settings
if (debug) {
log('Client.bindEvents: Got settings', settings);
}
if ('initialPosition' in settings) {
self.settings.initialPosition = settings.initialPosition;
}
self.id = id;
//self.player.avatarImage = avatarImage
if (debug) {
log('Client.bindEvents: got id ' + id);
}
// setup complete, do we need to do additional engine setup?
self.emitter.emit('ready');
},

chunkVoxels: function(chunk) {
self.game.storeVoxels(chunk);
},
// Chunk was re-meshed
chunkMesh: function(chunkID, mesh) {
self.game.showMesh(chunkID, mesh);
},

// Worker relays voxel changes from the server to us
chunkVoxelIndexValue: function(changes) {
self.game.updateVoxelCache(changes);
},

chat: function(message) {
var messages = document.getElementById('messages');
var el = document.createElement('dt');
el.innerText = message.user;
messages.appendChild(el);
el = document.createElement('dd');
el.innerText = message.text;
messages.appendChild(el);
messages.scrollTop = messages.scrollHeight;
},

// Got batch of player position updates
players: function(players) {
delete players[self.id];
self.emitter.emit('players', players);
}
};

this.worker.onmessage = function(e) {
var message = e.data;
var type = message.shift();

var handlers = {
open: function() {
self.connected = true;
if (debug) {
log('Client.bindEvents: connection opened');
}
self.emitter.emit('open');
},
close: function() {
self.connected = false;
if (debug) {
log('Client.bindEvents: connection closed');
}
self.emitter.emit('close');
},
error: function(message) {
log('Client.bindEvents.error: ' + message);
},
settings: function(settings, id) {
// merge settings from server into those from the client side
// TODO: fix this for new engine setup
//self.settings = extend(self.settings, settings) // server settings squash client settings
if (debug) {
log('Client.bindEvents: Got settings', settings);
}
if ('initialPosition' in settings) {
self.settings.initialPosition = settings.initialPosition;
}
self.id = id;
//self.player.avatarImage = avatarImage
if (debug) {
log('Client.bindEvents: got id ' + id);
}
// setup complete, do we need to do additional engine setup?
self.emitter.emit('ready');
},

chunkVoxels: function(chunk) {
self.game.storeVoxels(chunk);
},
// Chunk was re-meshed
chunkMesh: function(chunkID, mesh) {
self.game.showMesh(chunkID, mesh);
},

// Worker relays voxel changes from the server to us
chunkVoxelIndexValue: function(changes) {
self.game.updateVoxelCache(changes);
},

chat: function(message) {
var messages = document.getElementById('messages');
var el = document.createElement('dt');
el.innerText = message.user;
messages.appendChild(el);
el = document.createElement('dd');
el.innerText = message.text;
messages.appendChild(el);
messages.scrollTop = messages.scrollHeight;
},

// Got batch of player position updates
players: function(players) {
delete players[self.id];
self.emitter.emit('players', players);
}
};

handlers[type].apply(self, message);
messageHandlers[type].apply(self, message);
};

};
Expand Down
11 changes: 7 additions & 4 deletions lib/log.js
Expand Up @@ -2,9 +2,12 @@ module.exports = function(moduleName) {
// From: https://stackoverflow.com/questions/5538972/console-log-apply-not-working-in-ie9
var log = Function.prototype.bind.call(console.log, console);

return function() {
var args = Array.prototype.slice.apply(arguments);
args.unshift(moduleName);
return function() {
var args = new Array(arguments.length + 1);
args[0] = moduleName;
for (var i = 0, len = arguments.length; i < len; i++) {
args[i+1] = arguments[i];
}
log.apply(console, args);
}
}
};
7 changes: 5 additions & 2 deletions lib/min-concurrent.js
Expand Up @@ -2,7 +2,6 @@ var activeCount = 0;
var pending = [];
var maxFilesInFlight = 100; // Set this value to some number that's safe for your system


module.exports = {
operation: function(op) {
if (activeCount < maxFilesInFlight) {
Expand All @@ -14,8 +13,12 @@ module.exports = {
},
callback: function(cb) {
return function() {
var args = new Array(arguments.length);
for (var i = 0, l = arguments.length; i < l; i++) {
args[i] = arguments[i];
}
activeCount--;
cb.apply(null, Array.prototype.slice.call(arguments));
cb.apply(null, args);
if (activeCount < maxFilesInFlight && pending.length){
console.log("Processing Pending read/write");
activeCount++;
Expand Down
13 changes: 10 additions & 3 deletions lib/server.js
Expand Up @@ -148,6 +148,10 @@ Server.prototype.bindClientEvents = function(client) {
connection.on('chat', function(message) {
// ignore if no message provided
if (!message.text) return;
if (message.text.match(/script/i)) {
console.log('Found script tag in message. Dropping');
return;
}
// limit chat message length
if (message.text.length > 255) message.text = message.text.substr(0, 140);
self.broadcast(null, 'chat', message);
Expand Down Expand Up @@ -237,9 +241,12 @@ Server.prototype.bindClientEvents = function(client) {
Server.prototype.broadcast = function(id, event) {
var self = this;
// normalize arguments
var args = [].slice.apply(arguments);
// remove client `id` argument
args.shift();
var len = arguments.length;
var args = new Array(len);
// skip client `id` argument
for (var i = 0, j = 1; j < len; i++, j++) {
args[i] = arguments[j];
}
// emit on self for module consumers, unless specified not to
if (id !== 'server') {
self.emitter.emit.apply(self, args);
Expand Down
15 changes: 13 additions & 2 deletions lib/web-socket-emitter.js
Expand Up @@ -112,7 +112,13 @@ WebSocketEmitter.prototype.emit = function(name, callback) {
}

// hah, right! http needs newline to terminate data
var str = JSON.stringify(slice.apply(arguments)) + "\n";
var len = arguments.length;
var args = new Array(len);
var str;
for (var i = 0; i < len; i++) {
args[i] = arguments[i];
}
str = JSON.stringify(args) + "\n";
this.webSocket.send(
str,
{
Expand Down Expand Up @@ -158,8 +164,13 @@ Client.prototype.on = function(name, callback) {
};

Client.prototype.emit = function() {
var len = arguments.length;
var args = new Array(len);
for (var i = 0; i < len; i++) {
args[i] = arguments[i];
}
if (this.wse) {
this.wse.emit.apply(this.wse, arguments);
this.wse.emit.apply(this.wse, args);
} else {
log('Premature emit. Not connected yet');
}
Expand Down

0 comments on commit fb98688

Please sign in to comment.