7
的记忆。解放出来ThreeJS应用
我知道有这个问题已经有几个问题:
- freeing memory in three.js
- Freeing memory with threejs
- Three.js Collada - What's the proper way to dispose() and release memory (garbage collection)?
我做使用下面的打字稿处理我的对象我所做的功能:
function dispose(object3D: THREE.Object3D): void
{
// Dispose children first
for (let childIndex = 0; childIndex < object3D.children.length; ++childIndex)
{
this.dispose(object3D.children[childIndex]);
}
object3D.children = [];
if (object3D instanceof THREE.Mesh)
{
// Geometry
object3D.geometry.dispose();
// Material(s)
if (object3D.material instanceof THREE.MultiMaterial)
{
for (let matIndex = 0; matIndex < object3D.material.materials.length; ++matIndex)
{
object3D.material.materials[matIndex].dispose();
object3D.material.materials[matIndex] = null;
}
object3D.material.materials = [];
}
if (object3D.material.dispose)
{
object3D.material.dispose();
object3D.material = null;
}
}
// Remove from parent
if (object3D.parent)
object3D.parent.remove(object3D);
object3D = null;
}
然而,当我使用Chrome开发者工具堆快照,我仍然有吨,吨:
- 阵列
- Vector2(乌布苏在
__directGeometry
,...) - 的Vector3(在
geometry
顶点,在faces
正常,faces
vertexColors,...) - Face3(在
geometry
面) - 色(颜色
__directGeometry
,...) - JSArrayBufferData(彩色,标准,在
geometry
attributes
,...)
因为内存中的所有数据,我的申请得到通过杀死在iOS上投弃,请参见:Jetsam kills WebGL application on iOS
我怀疑一些数据里面,当我问到程序库没有释放出来。
这听起来更像是Jetsam过于激进。 JavaScript是垃圾收集的,因此释放对象后立即获取堆快照可能不是100%反映GC之后的内存状态。物体是否会消失(如1分钟后)?如果不是,那么在代码中可能还有其他对它们的引用还没有被释放,因为如果没有引用它,GC只能收集一个对象。 – TheJim01
遗憾的是,似乎他们仍然在内存中,甚至在1分钟后(这是一个相当长的时间,我认为GC会更经常地做它的工作)。在代码中可能有其他引用没有被释放,这是为什么这些对象不会从内存中清除的唯一原因。 @ TheJim01:你知道,如果有一个“简单”的方式来“标记”,在代码的对象,以便在Chrome浏览器开发工具很容易地检索它,这样我能看到它的参考? – Hellium
不幸的是,我不知道有任何简单的方法来找到参考。如果你知道,让我知道! :)除此之外,我将这个问题减小到最简单的形式:写一个非常简单的JavaScript的唯一的应用程序(不打字稿),看看它执行相同的方式。如果确实如此,那么我不确定你还能做什么。 – TheJim01