假设我们有一个带有两个按钮的页面,创建和销毁。当您在此内存测试中单击创建 Three.js 场景时,将动态添加到页面并开始运行。单击销毁应该删除场景,释放所有缓冲区并释放所有内存等。 http://mrdoob.github.com/three.js/examples/webgl_test_memory.html
有谁知道如何在不构图和更改网址的情况下做到这一点?
谢谢
假设我们有一个带有两个按钮的页面,创建和销毁。当您在此内存测试中单击创建 Three.js 场景时,将动态添加到页面并开始运行。单击销毁应该删除场景,释放所有缓冲区并释放所有内存等。 http://mrdoob.github.com/three.js/examples/webgl_test_memory.html
有谁知道如何在不构图和更改网址的情况下做到这一点?
谢谢
我认为您需要在侧面几何、材质和纹理中使用 dispose() 方法。
geometry.dispose();
material.dispose();
texture.dispose();
https://github.com/mrdoob/three.js/blob/master/examples/webgl_test_memory.html
JavaScript 是一种垃圾收集语言。如果您不再对某个对象(如旧场景)有任何引用,那么内存最终将被回收,除非某处的实现中存在错误。不过,您链接到的页面似乎工作正常。
我本人长期以来一直为这个问题所困扰,提出了 chrome 和 Three.js 的错误报告,但找不到任何解决方案。
由于某些原因,即使很长时间后内存也不会释放,并且似乎有东西一直指向内存块,因此垃圾收集器永远不会释放它。
然而,这对我来说是什么诀窍
通过这种方式,我能够从 Three.js 场景中获得超过 600MB 的 RAM。
更新
Doob 先生和 WestLangley 的回答内存泄漏与three.js 和许多形状,我还没有用我的代码测试这个。
在 webGLRenderer 中,删除网格后
scene.remove( mesh )
,
你可以释放内存
renderer.deallocateObject( mesh );
您可以使用释放纹理
renderer.deallocateTexture( texture );