首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >释放ThreeJS应用程序的内存

释放ThreeJS应用程序的内存
EN

Stack Overflow用户
提问于 2017-06-01 10:32:07
回答 1查看 1.2K关注 0票数 10

目前,我在ThreeJS应用程序中释放内存存在问题。

我知道关于这个问题已经有几个问题了:

I do使用我所做的以下类型记录函数来释放对象:

代码语言:javascript
复制
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 (uvs in __directGeometry,.)
  • Vector3 ( geometry中的顶点,faces中的正规,faces中的vertexColors,.)
  • Face3 (geometry中的faces)
  • 颜色( __directGeometry中的颜色,.)
  • JSArrayBufferData (颜色,正常,在attributes of geometry,.)

由于内存中的所有数据,我的应用程序在iOS上被Jetsam杀死,请参阅:Jetsam kills WebGL application on iOS

当我要求时,我怀疑库中的一些数据没有被释放。

EN

回答 1

Stack Overflow用户

发布于 2017-06-08 20:28:07

试着把所有东西都处理掉。我要用这个片段一段时间。它处理材料,纹理,三维物体。它迭代数组和普通对象。

代码语言:javascript
复制
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);
    }
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44305165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档