5

假设我们有一个带有两个按钮的页面,创建和销毁。当您在此内存测试中单击创建 Three.js 场景时,将动态添加到页面并开始运行。单击销毁应该删除场景,释放所有缓冲区并释放所有内存等。 http://mrdoob.github.com/three.js/examples/webgl_test_memory.html

有谁知道如何在不构图和更改网址的情况下做到这一点?

谢谢

4

3 回答 3

2

我认为您需要在侧面几何、材质和纹理中使用 dispose() 方法。

geometry.dispose();
material.dispose();
texture.dispose();

https://github.com/mrdoob/three.js/blob/master/examples/webgl_test_memory.html

于 2016-04-07T19:39:44.907 回答
1

JavaScript 是一种垃圾收集语言。如果您不再对某个对象(如旧场景)有任何引用,那么内存最终将被回收,除非某处的实现中存在错误。不过,您链接到的页面似乎工作正常。

于 2013-01-24T17:18:28.097 回答
1

我本人长期以来一直为这个问题所困扰,提出了 chrome 和 Three.js 的错误报告,但找不到任何解决方案。

由于某些原因,即使很长时间后内存也不会释放,并且似乎有东西一直指向内存块,因此垃圾收集器永远不会释放它。

然而,这对我来说是什么诀窍

  1. 创建一个数组,该数组将保存添加到场景中的所有项目。
  2. 每当您向场景添加额外的项目时,请将其添加到此数组中。
  3. 在销毁功能上,运行 scene.remove('item name') 将它们从场景中移除。
  4. 现在遍历数组并手动使所有项目未定义。

通过这种方式,我能够从 Three.js 场景中获得超过 600MB 的 RAM。

更新

Doob 先生和 WestLangley 的回答内存泄漏与three.js 和许多形状,我还没有用我的代码测试这个。

在 webGLRenderer 中,删除网格后

scene.remove( mesh ),

你可以释放内存

renderer.deallocateObject( mesh );

您可以使用释放纹理

renderer.deallocateTexture( texture );

于 2014-02-12T10:44:23.710 回答