1

我目前正在第一次学习 three.js 和 3D 图形,并且正在尝试创建一个体素引擎(想想 Minecraft、Infiniminer)。我发现我的脚本占用了大量内存,但我怀疑为什么 - 我创建的每个块都使用一个新的 Mesh 对象,即使其中一些块看起来相同。

我问一些我认识的人,他们是否知道一种更节省内存的方法——他们建议为每种类型的块创建一个网格,并使用矩阵为块的每个实例转换网格(他们熟悉 OpenGL ,但不是这么多的三个.js)。three.js 是否允许这样的事情?如果是这样,你会怎么做,如果不是,还有其他选择吗?

(到目前为止,我的理解是您要渲染的每个项目都需要在场景图中,因此即使多个块看起来相同,您也需要将块的多个副本(具有不同的 x、y、z 坐标)添加到图。我可能错了。)

4

2 回答 2

1

美好的一天,只是为了澄清。Three.js 是 WebGL API 的包装器,它是 OpenGL ES 2.0 的子集,没有扩展。所以OpenGL相关知识在这里适用一点,你只需要通过Three.js源码从高到低工作。

现在,拥有一组基本对象然后克隆和重新定位它们的想法是合理的。有一个clone()功能,本质上这是为您创建一个全新的对象,就像您正在创建新的网格一样,但在运行时更易于访问。

如果我可以提供一些建议,查看一些代码可以帮助我们为您的用例找出更精确的优化。也许您有一些可以/应该被推送到初始化阶段的调用,也许内存在其他地方泄漏?或者,您可以考虑在代码或 3D 建模程序中合并一些几何图形(如果它保持静态)。这不会显着减少多边形数量,但肯定有助于简化您的场景。

于 2013-09-12T15:31:50.627 回答
1

我相信他们正在完成您在three.js 轨迹球控件中所要求的内容。 在此处查看此链接

如果您在查看源代码时遇到问题,请使用键盘快捷键 cntrl + u (windows)

于 2013-09-12T11:39:27.993 回答