3

这是我在这里的第一个问题,所以我希望它符合准则。也请原谅我的英语不好。

我目前正在开发一个基于three.js 的WebGL 应用程序,它显示了数千个立方体和这些立方体之间的线条。我有几个性能问题,所以我决定将所有立方体合并到一个几何体中。这有点帮助,但实际上性能会因数千行(都有自己的几何体(基于 three.js 的 NURBSCurve 示例)和着色器材质(着色器从行头到尾混合两种颜色)而减慢并控制不透明度)。我最大的数据包括超过 9000 条线和超过 5000 个立方体。没有这些线,FPS 速率在 45 - 50 (DirectX) 或 20 FPS (OpenGL) 之间,但有了这些线,性能下降到 5 FPS。我只有一个英特尔高清显卡(第 5 代)显卡,因此最大 FPS 似乎限制为 60 FPS,但在我的情况下这完全足够了。正如我之前所说,这些线是 NURBS 曲线,它们的范围从短曲线到长而复杂的曲线。另一个要求(这让我有点头疼 ;-))是每条线的宽度都不同,所以我实际上必须使用 OpenGL,这在我的情况下速度较慢并且还会导致一些其他问题。

无论如何,我尝试了几种方法,但没有一种方法能真正帮助我解决问题。

1)为每条线创建管道并合并几何。-> 这将场景的创建时间从 1 秒减至几分钟。此外FPS率无法提高。这实际上是预期的,因为这种方法产生了大量的顶点和面。

2) 减少曲线点。-> 从 200 点减少到 50 点,这有助于稍微提高 FPS。减少到 25 分并没有带来任何改进。我正在考虑编写一种方法来减少不需要的点(比如在直线曲线中,2 个而不是 50 个点就足够了),但我不知道如何实现这一点,所以我首先考虑了其他方法。也许我会回到这个。

3) 使用 BufferGeometry。-> BufferGeometry 似乎不能与着色器材质一起使用。至少在我的情况下,我没有让它工作,所以我的尝试都没有显示任何东西。顺便说一句,我使用 THREE.BufferGeometryUtils 从我的 NURBS 曲线创建缓冲区几何图形。我尝试将 THREE.VertexColors 设置为几何中的函数和 colorsNeedUpdate 的参数,但仍然没有显示。实际上,我也尝试了带有路缘几何的缓冲几何,但性能没有任何改进。

4) 使用样条曲线代替 NURBS 曲线。->曲线的路径不像我希望的那样,也没有任何改进。

5) 使用 THREE.LinePieces 将行合并为一行。-> 好吧,虽然我不得不将顶点数量增加一倍,但这实际上有很大帮助。在 DirectX 的情况下,性能从 5 FPS 提高到 25 FPS(OpenGL 仍为 4 FPS),但这种解决方案不适合我的情况。原因是线条的宽度不能不同,这是在 DirectX 无论如何都限制为 1 的情况下。我想知道其他人如何解决线宽限制的问题,并发现有些人正在通过几何着色器创建更粗的线。所以我的新希望是这个几何着色器。但后来我发现 WebGL 不支持几何着色器。

很抱歉到目前为止对我的方法的解释很长。在尝试了所有这些之后,我无法想出任何新的想法。现在我想从专家那里知道我是否应该忍受 FPS 下降,或者是否还有其他方法可以尝试?

4

1 回答 1

1

我想出了按宽度捆绑线条然后使用THREE.LinePieces. 在最好的情况下,我可以将大约 860 行减少到只有 2 行。当然,这个解决方案的有效性取决于数据。此外,我仍然有 DirectX 比 OpenGL 快得多的问题(例如 50 FPS 而不是 8 FPS),但我需要后者来支持更粗的线条。因此,如果有人为我支持 DirectX 的问题提出解决方案,我将不胜感激:-)。

于 2013-10-16T01:30:44.737 回答