kopia lustrzana https://github.com/robhawkes/vizicities
Refining Web Worker object loading
rodzic
c1ea53660a
commit
7c928d7235
|
@ -3,7 +3,7 @@
|
|||
"use strict";
|
||||
|
||||
// http://addyosmani.com/resources/essentialjsdesignpatterns/book/#mediatorpatternjavascript
|
||||
VIZI.Log = function(msg) {
|
||||
console.log(msg);
|
||||
};
|
||||
// https://gist.github.com/bgrins/5108712
|
||||
VIZI.Log = console.log.bind(console);
|
||||
VIZI.Log.apply(this, arguments);
|
||||
}());
|
|
@ -41,19 +41,26 @@
|
|||
|
||||
VIZI.ObjectManager.prototype.workerPromise = function(worker, features) {
|
||||
var deferred = Q.defer();
|
||||
|
||||
var startTime = Date.now();
|
||||
worker.process(features).then(function(data) {
|
||||
deferred.resolve(data);
|
||||
var timeToSend = data.startTime - startTime;
|
||||
var timeToArrive = Date.now() - data.timeSent;
|
||||
deferred.resolve({data: data, timeToArrive: timeToArrive, timeToSend: timeToSend});
|
||||
});
|
||||
return deferred.promise;
|
||||
};
|
||||
|
||||
// TODO: Should be possible if geo functionality can be performed before / after the worker task
|
||||
// TODO: Try and get rid of lock-up that occurs at beginning and end of worker process (possibly due to data being sent back and forth)
|
||||
VIZI.ObjectManager.prototype.processFeaturesWorker = function(features) {
|
||||
VIZI.Log("Processing features using worker");
|
||||
|
||||
var geo = VIZI.Geo.getInstance();
|
||||
|
||||
// Convert coordinates
|
||||
var coordinateTime = Date.now();
|
||||
|
||||
_.each(features, function(feature) {
|
||||
var coords = feature.geometry.coordinates[0];
|
||||
feature.geometry.coordinatesConverted = [[]];
|
||||
|
@ -62,6 +69,8 @@
|
|||
});
|
||||
});
|
||||
|
||||
VIZI.Log("Converting coordinates: " + (Date.now() - coordinateTime));
|
||||
|
||||
var worker = cw({
|
||||
process: function(features) {
|
||||
importScripts("worker/three.min.js", "worker/GeometryExporter.js", "worker/underscore.min.js");
|
||||
|
@ -86,6 +95,8 @@
|
|||
|
||||
var combinedGeom = new THREE.Geometry();
|
||||
|
||||
var count = 0;
|
||||
|
||||
_.each(features, function(feature) {
|
||||
var properties = feature.properties;
|
||||
|
||||
|
@ -129,13 +140,23 @@
|
|||
|
||||
// meshes.push(mesh);
|
||||
THREE.GeometryUtils.merge(combinedGeom, mesh);
|
||||
|
||||
count++;
|
||||
});
|
||||
|
||||
// return Date.now() - startTime;
|
||||
var timeTaken = Date.now() - startTime;
|
||||
var exportedGeom = exporter.parse(combinedGeom);
|
||||
// var exportedGeom = {};
|
||||
|
||||
// The size of this seems to be the problem
|
||||
// Work out how to reduce it
|
||||
var size = JSON.stringify(exportedGeom).length;
|
||||
|
||||
var timeSent = Date.now();
|
||||
|
||||
// return meshes;
|
||||
|
||||
return exporter.parse(combinedGeom);
|
||||
return {json: exportedGeom, size: size, count: count, startTime: startTime, timeTaken: timeTaken, timeSent: timeSent};
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -146,7 +167,7 @@
|
|||
// TODO: Work out why not every feature is being returned in the promises (about 10–20 less than expected)
|
||||
|
||||
// Batch features
|
||||
var batches = 4;
|
||||
var batches = 20;
|
||||
var featuresPerBatch = Math.ceil(features.length / batches);
|
||||
var batchedMeshes = [];
|
||||
var batchPromises = [];
|
||||
|
@ -186,18 +207,35 @@
|
|||
_.each(promises, function (promise) {
|
||||
if (promise.state === "fulfilled") {
|
||||
var value = promise.value;
|
||||
var data = value.data;
|
||||
|
||||
var json = loader.parse(value);
|
||||
var mesh = new THREE.Mesh(json.geometry, material);
|
||||
// Not sure how reliable this time is
|
||||
var timeToSend = value.timeToSend;
|
||||
|
||||
var timeToArrive = value.timeToArrive;
|
||||
var timeTaken = data.timeTaken;
|
||||
var size = data.size;
|
||||
var count = data.count;
|
||||
var json = data.json;
|
||||
|
||||
VIZI.Log("Worker input sent in " + timeToSend + "ms");
|
||||
VIZI.Log("Worker output received in " + timeToArrive + "ms");
|
||||
VIZI.Log("Worker output size is " + size);
|
||||
VIZI.Log("Processed " + count + " features in " + timeTaken + "ms");
|
||||
|
||||
VIZI.Log(json);
|
||||
|
||||
// TODO: Stop this locking up the browser
|
||||
var geom = loader.parse(json);
|
||||
var mesh = new THREE.Mesh(geom.geometry, material);
|
||||
self.publish("addToScene", mesh);
|
||||
|
||||
// count += value.length;
|
||||
// VIZI.Log(value);
|
||||
// count += data.length;
|
||||
}
|
||||
});
|
||||
|
||||
// VIZI.Log(count);
|
||||
VIZI.Log(Date.now() - startTime);
|
||||
VIZI.Log("Overall worker time is " + (Date.now() - startTime) + "ms");
|
||||
}).done();
|
||||
};
|
||||
|
||||
|
@ -207,6 +245,7 @@
|
|||
var geo = VIZI.Geo.getInstance();
|
||||
|
||||
// Convert coordinates
|
||||
var coordinateTime = Date.now();
|
||||
_.each(features, function(feature) {
|
||||
var coords = feature.geometry.coordinates[0];
|
||||
feature.geometry.coordinatesConverted = [[]];
|
||||
|
@ -214,6 +253,7 @@
|
|||
feature.geometry.coordinatesConverted[0].push(geo.projection(coord));
|
||||
});
|
||||
});
|
||||
VIZI.Log("Converting coordinates: " + Date.now() - coordinateTime);
|
||||
|
||||
VIZI.Log(features);
|
||||
|
||||
|
|
Ładowanie…
Reference in New Issue