目前,我在ThreeJS应用程序中释放内存存在问题。
我知道关于这个问题已经有几个问题了:
I do使用我所做的以下类型记录函数来释放对象:
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工具进行堆快照时,仍然有大量的:
__directGeometry,.)geometry中的顶点,faces中的正规,faces中的vertexColors,.)geometry中的faces)__directGeometry中的颜色,.)attributes of geometry,.)由于内存中的所有数据,我的应用程序在iOS上被Jetsam杀死,请参阅:Jetsam kills WebGL application on iOS
当我要求时,我怀疑库中的一些数据没有被释放。
发布于 2017-06-08 20:28:07
试着把所有东西都处理掉。我要用这个片段一段时间。它处理材料,纹理,三维物体。它迭代数组和普通对象。
let dispose = function(o) {
try {
if (o && typeof o === 'object') {
if (Array.isArray(o)) {
o.forEach(dispose);
} else
if (o instanceof THREE.Object3D) {
dispose(o.geometry);
dispose(o.material);
if (o.parent) {
o.parent.remove(o);
}
dispose(o.children);
} else
if (o instanceof THREE.Geometry) {
o.dispose();
} else
if (o instanceof THREE.Material) {
o.dispose();
dispose(o.materials);
dispose(o.map);
dispose(o.lightMap);
dispose(o.bumpMap);
dispose(o.normalMap);
dispose(o.specularMap);
dispose(o.envMap);
} else
if (typeof o.dispose === 'function') {
o.dispose();
} else {
Object.values(o).forEach(dispose);
}
}
} catch (error) {
console.log(error);
}
};https://stackoverflow.com/questions/44305165
复制相似问题