I display 25000 lines in THREEJS and the performance is pretty poor. (<5FPS)
I follow the "simplest" approach by creating 1 mesh per line and adding it to the scene:
// trks is an array that contains 25000 geometries
var trks = ...;
var material = new THREE.LineBasicMaterial({ vertexColors: THREE.VertexColors });
for(var i = 0; i<trks.length; i++) {
var line = new THREE.Line( trks[i].geometry, material);
scene.add( line );
}
I generate regular geometries (vs buffer geometries) as:
var geometry = new THREE.Geometry();
...
// push n vertices
geometry.vertices.push(new THREE.Vector3(track.points[k][0], track.points[k][1], track.points[k][2]));
...
// push n colors
geometry.colors.push(new THREE.Color(diff[0], diff[1], diff[2]));
Live JSFiddle: http://jsfiddle.net/16fnyb8k/34/
Geometry creation: https://github.com/FNNDSC/ami/blob/dev/src/loaders/loaders.trk.js#L328-L408
Should I merge all the geometries together somehow? Use buffer geometries instead (would that have any impact on performace)? both?
=== UPDATE ===
I did a dummy test with N BufferGeometries but it doesn't seem to really have any impact:
for(var i = 0; i<trks.length; i++) {
// create buffer geometry per track
var bufferGeometry = new THREE.BufferGeometry();
var vertices = [];
for(var j=0; j<trks[i].geometry.vertices.length; j++) {
vertices.push(trks[i].geometry.vertices[j].x);
vertices.push(trks[i].geometry.vertices[j].y);
vertices.push(trks[i].geometry.vertices[j].z);
}
var fvertices = new Float32Array(vertices);
bufferGeometry.addAttribute( 'position', new THREE.BufferAttribute( fvertices, 3 ) );
// create mesh
var line = new THREE.Line( bufferGeometry, material);
line.applyMatrix(series[0].stack[0].ijk2LPS);
scene.add( line );
}
Live Fiddle: http://jsfiddle.net/16fnyb8k/51/
=== UPDATE 2 ===
Using buffer geometries and merging all lines together makes it much smoother, however all the lines are now connected:
var bufferGeometry = new THREE.BufferGeometry();
var vertices = [];
var colors = [];
for(var i = 0; i<trks.length; i++) {
for(var j=0; j<trks[i].geometry.vertices.length; j++) {
vertices.push(trks[i].geometry.vertices[j].x);
vertices.push(trks[i].geometry.vertices[j].y);
vertices.push(trks[i].geometry.vertices[j].z);
colors.push(trks[i].geometry.colors[j].r);
colors.push(trks[i].geometry.colors[j].g);
colors.push(trks[i].geometry.colors[j].b);
}
}
var fvertices = new Float32Array(vertices);
var fcolors = new Float32Array(colors);
bufferGeometry.addAttribute( 'position', new THREE.BufferAttribute( fvertices, 3 ) );
bufferGeometry.addAttribute( 'color', new THREE.BufferAttribute( fcolors, 3 ) );
var line = new THREE.Line( bufferGeometry, material);
line.applyMatrix(series[0].stack[0].ijk2LPS);
scene.add( line );
JS Fiddle: http://jsfiddle.net/16fnyb8k/59/
Thanks
Create line segments from a buffer geometry.
Live demo: http://jsfiddle.net/16fnyb8k/61/