2012-09-21 52 views
2

我正在模拟运行在我们太阳系周围的小行星的小行星。你可以看到一个初始实现here在Three.js中改善粒子系统性能

我将整套轨道对象转换为单个ParticleSystem,我可以在我的家用机器上以60fps的速度运行10,000个轨道(笔记本电脑的速度约为30fps)。 15-20k将我的机器降至30fps。

我运行一个网络工作者来计算位置的新列表,然后我更新每个对象的位置在主线程像这样:

for (var j=0; j < positions.length; j++) { 
     myobjects[j].MoveParticleToPosition(positions[j]); 
    } 
    particle_geometry.__dirtyVertices = true; 

MoveParticleToPosition:

var vertex_particle = this.particle_geometry.vertices[this.vertex_pos]; 
    vertex_particle.x = pos[0]; 
    vertex_particle.y = pos[1]; 
    vertex_particle.z = pos[2]; 

我问题是:我如何从这里提高绩效?

例如,是否有更快的方法来更新几何顶点?有没有可以应用于粒子系统的优化?是否有可能更新网络工作者内的顶点?

+0

不再支持__dirty标志。您可以更新到three.js的当前版本,并查看wiki:https://github.com/mrdoob/three.js/wiki/Updates。 – WestLangley

回答

3

除了切换到ParticleSystem之外,我还使用了其他两种技术来提高性能。没有一个是Three.js特有的。他们涉及使用网络工作者和分割循环块setTimeout为Three.js提供更新渲染的机会。

我写了一个博客帖子有更多的技术细节here