【问题标题】:Instancing Multiple Objects Lowers Framerate of WEBGL Application实例化多个对象会降低 WEBGL 应用程序的帧速率
【发布时间】:2015-12-15 08:54:34
【问题描述】:

我正在开发一个 THREE.JS WebGL 应用程序,我需要在其中渲染多个具有相同几何形状的对象,但我偶然发现了一个瓶颈。似乎我的对象实例存在一些问题,我无法真正理解/意识到,也许有人可以帮助我。对于上下文,我有一个带有法线的 PointCloud,它为我提供了有关将实例化对象放置在何处的信息,以及对象通过法线四元数的方向。然后,我遍历这个数组,并相应地放置每个实例化对象。在查看了有关实例化、合并等的各种帖子后,我无法弄清楚我做错了什么。

我附上相关方法的代码sn-p:

bitbucket.org/sn-ps/electricganesha/Mdddz

多次查看后,我真的很想知道这里出了什么问题,为什么这种特殊方法会使我的应用程序从 60fps 减慢到 20fps。

【问题讨论】:

  • 你实例化了多少点/对象?
  • 大约 300 个对象,每个对象具有以下几何形状:1254 个点、4884 个顶点、1232 个图元
  • 只是为了澄清一下,“实例化”是指这个吗? khronos.org/registry/webgl/extensions/ANGLE_instanced_arrays
  • 不,我所说的实例化是指加载对象和纹理一次,然后在一个循环中复制它。

标签: javascript opengl-es 3d three.js webgl


【解决方案1】:

您可能对优化进行了过度补偿。

在合并所有这些几何图形的循环中,尝试添加类似这样的内容

var maxVerts = 1 << 16;

//if merging a new object causes the vert number to go over 2^16 push the merged geometry somewhere, and make a new one for the next batch
if( singleGeometry.vertices.length + newObject.geometry.vertices.length > maxVerts ){
  scene.add(singleGeometry);
  singleGeometry = new Geometry();
}

singleGeometry.merge(newObject.geometry, newObject.matrix);

【讨论】:

  • 我会尝试这种方法,但是即使没有合并几何体,300 个对象的渲染是否应该如此繁重?
  • 300 不应该,3000 甚至应该没问题,具体取决于具体情况,但从我看到的你没有这样做,你把所有东西都粘在一个网格中,而 three.js 确实似乎不喜欢那样,至少直到最近才喜欢
  • 好的,所以我尝试了你的方法,它没有改善,性能和以前一样。我还尝试不合并几何图形并逐个对象添加对象,而不进行合并,这会降低我在 5fps 中的性能。我对此完全感到困惑。
  • 如果没有看到更多代码和实际的现场演示,我想这真的很难提供帮助
  • 最终,我发现问题出在我的机器/显卡上,尽管进行了优化,但仍处理了大量繁重的几何图形。我最终简化了几何图形并使用法线贴图来模拟细节,这大大提高了性能。谢谢大家的回复!
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多