【发布时间】:2014-04-29 05:34:27
【问题描述】:
-Three.js 版本 66
-在 Chrome v33 中运行(最新)
-WebGL 渲染器
我有一个场景,我在其中绘制对象(节点)。这些对象都是我添加到场景中的“根”对象的所有子对象。用户可以按下按钮并切换要添加/删除的节点子集(无需更改/破坏相机)。
每次切换后,动画(相机移动)变得越来越慢,这向我表明存在泄漏。我已经查看了对象内部的任何地方和一些 WebGL 缓冲区,但我找不到泄漏。
在处理场景时我可能会遗漏一些东西吗?
我执行以下操作:
- 创建 WebGL 渲染器和场景对象
- 创建相机和照明并将它们添加到场景中
- 创建一个“根”object3d,将其添加到场景中
- 为每个节点创建一个 BoxGeometry、mesh、object3d 并将其添加到根对象
当用户按下按钮时:
- 从场景中移除所有 root 子节点
- 对于节点子集,创建 BoxGeometry、mesh、object3d 并将其添加到根对象
当用户再次按下按钮时:
- 从场景中移除所有 root 子节点
- 为每个节点创建 BoxGeometry、mesh、object3d 并将其添加到根对象
感谢任何帮助!!!
编辑
我实际上刚刚发现了问题。我的重绘方法再次调用了我的动画钩子,因此每种类型都添加了另一个额外的无意义动画。
如果其他人遇到此问题,请确保您只调用一次 ANIMATE 方法
为了帮助任何寻找通用清理的人,这就是我正在做的事情:
function doDispose(obj)
{
if (obj !== null)
{
for (var i = 0; i < obj.children.length; i++)
{
doDispose(obj.children[i]);
}
if (obj.geometry)
{
obj.geometry.dispose();
obj.geometry = undefined;
}
if (obj.material)
{
if (obj.material.materials)
{
for (i = 0; i < obj.material.materials.length; i++)
{
obj.material.materials[i].dispose();
}
}
else
{
obj.material.dispose();
}
obj.material = undefined;
}
if (obj.texture)
{
obj.texture.dispose();
obj.texture = undefined;
}
}
obj = undefined;
}
【问题讨论】:
-
你还需要去掉
obj.material.dispose();周围的else条件。 -
我遇到了同样的问题并且正在做同样的事情!非常感谢。
-
我在搜索在处理几何/对象时是否清理动画时发现了这篇文章。希望其他人知道动画没有被删除会有所帮助,因此它可能有助于您的 dispose 函数包含清理代码。
function deleteAnimations(obj){ var globAnims = THREE.AnimationHandler.animations; var id = obj.id; for (var i=0, l=globAnims.length; i<l; i++){ if (globAnims[i].root.id === id){ globAnims[i].stop(); } } } -
我可以告诉你防止动画函数多次运行吗?我已经为这个问题苦苦挣扎了很长时间。非常感谢!
-
@Richard 你知道如何在新版本 r94 中清理动画