移动物体性能 - ThreeJs

时间:2014-09-26 09:35:13

标签: javascript three.js

背景:

我正在开发一个非常简单的THREE.JS项目,我相信它是以一种非常好的方式进行优化的。 我使用WebGLRenderer来显示每50ms从音频信号中提取的很多Bode图。这很酷,但显然,我显示的Bode越多,它就越迟钝。此外,Bodes正在以恒定速度移动,让新的一些空间显示出来。

我现在已经实现了每一个基本的"我在互联网上发现的优化,我设法在显示的大约10.000.000线上不断获得30 fps,这样一台糟糕的电脑(nVidia GT 210和Core i3 2100 ......)。

另请注意我是not using any lights,反思......只有基本行=)

由于这是一个有效的项目,我不允许显示一些截图/代码,对不起......

当前实施:

我使用数组存储我的所有Bodes,每个Bodes都通过THREE.Line显示。
仅供参考,实际上是2000 THREE.Line。

当Bode显示并移动40秒后,它将被删除,并且THREE.Line将与另一个重复使用。请注意,要移动这些内容,请{m} {m} {/ 1}。

另请注意,我已经禁用了我的场景和对象矩阵autoUpdate,因为我手动执行此操作。 (Thx用于指出Volune)。

我的问题:

  

THREE.Line.position修改会导致一些沉重的   渲染器已经完成的计算?或者是three.js意识到我的对象没有改变   避免这些?

换句话说,我想知道渲染/更新刚刚翻译的同一个对象在渲染过程中是否比单独留下更重,而不更新其矩阵等... 在ThreeJS中是否有任何类型的低级优化关于多次渲染相同的对象?移动对象时是否取消了此优化?

如果是这样的话,我还记得另一种方法:只使用两个相互对应的大网格,但这会导致每个帧的几何形状的合并/删除部分...可能是更好吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我在资源(herehere)中发现,无论位置是否发生变化,网格矩阵都会每帧更新。

这意味着位置修改本身不会导致繁重的计算。这也意味着更新了很多矩阵,并且每帧都会向GC发送大量的制服。

我建议用一两个大网格尝试你的想法。这应该减少THREE.js内部的javascript计算,并且与GC的唯一重要通信是相对于大缓冲区。
另请注意,存在一个WebGL函数bufferSubDataMSDN documentation)来更新缓冲区的某些部分,但似乎not yet usable in THREE.js