【问题标题】:Reusing three.js meshes (for voxel worlds)重用 three.js 网格(用于体素世界)
【发布时间】:2013-09-12 06:47:07
【问题描述】:

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

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

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

【问题讨论】:

标签: 3d three.js voxel


【解决方案1】:

我相信他们正在完成您在 three.js 轨迹球控件中的要求。 Check out this link here

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

【讨论】:

  • 从第 92 行看,我认为每个金字塔都是它自己的 Mesh 对象...("new" THREE.Mesh(geometry, material))
  • 是的,你是对的,看起来他们在该声明中创建了 500 个三角形。 :(
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回复 - 我查看了 clone() 但我认为创建新对象不会起作用。我目前的进度是here - 大部分相关代码都在 world.js 和 blocks.js 中。我目前正在合并我的一些块几何图形,但是由于玩家需要能够编辑环境,因此也存储了各个块本身(因此需要考虑内存)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 2017-05-28
相关资源
最近更新 更多