From fb986886d63ee146b503eb8ce817f431ad28d098 Mon Sep 17 00:00:00 2001 From: Alan Szlosek Date: Wed, 8 Jun 2016 13:58:13 -0400 Subject: [PATCH] help v8 optimize --- client-worker.js | 7 +- lib/client.js | 138 +++++++++++++++++++------------------- lib/log.js | 11 +-- lib/min-concurrent.js | 7 +- lib/server.js | 13 +++- lib/web-socket-emitter.js | 15 ++++- 6 files changed, 109 insertions(+), 82 deletions(-) diff --git a/client-worker.js b/client-worker.js index 25225542..152b4e1e 100644 --- a/client-worker.js +++ b/client-worker.js @@ -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); }, diff --git a/lib/client.js b/lib/client.js index 48db3a0c..a0a73f3c 100644 --- a/lib/client.js +++ b/lib/client.js @@ -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); }; }; diff --git a/lib/log.js b/lib/log.js index a93ed3ee..eb6f5bb7 100644 --- a/lib/log.js +++ b/lib/log.js @@ -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); - } + } }; \ No newline at end of file diff --git a/lib/min-concurrent.js b/lib/min-concurrent.js index a0a7777d..ebf0e36b 100644 --- a/lib/min-concurrent.js +++ b/lib/min-concurrent.js @@ -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) { @@ -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++; diff --git a/lib/server.js b/lib/server.js index 91576afd..7691e6b6 100644 --- a/lib/server.js +++ b/lib/server.js @@ -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); @@ -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); diff --git a/lib/web-socket-emitter.js b/lib/web-socket-emitter.js index 5cbc8e02..d18d5eb7 100644 --- a/lib/web-socket-emitter.js +++ b/lib/web-socket-emitter.js @@ -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, { @@ -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'); }