2017-06-01 51 views
7

的记忆。解放出来ThreeJS应用

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

使用下面的打字稿处理我的对象我所做的功能:

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(彩色,标准,在geometryattributes,...)

因为内存中的所有数据,我的申请得到通过杀死在iOS上投弃,请参见:Jetsam kills WebGL application on iOS

我怀疑一些数据里面,当我问到程序库没有释放出来。

+1

这听起来更像是Jetsam过于激进。 JavaScript是垃圾收集的,因此释放对象后立即获取堆快照可能不是100%反映GC之后的内存状态。物体是否会消失(如1分钟后)?如果不是,那么在代码中可能还有其他对它们的引用还没有被释放,因为如果没有引用它,GC只能收集一个对象。 – TheJim01

+0

遗憾的是,似乎他们仍然在内存中,甚至在1分钟后(这是一个相当长的时间,我认为GC会更经常地做它的工作)。在代码中可能有其他引用没有被释放,这是为什么这些对象不会从内存中清除的唯一原因。 @ TheJim01:你知道,如果有一个“简单”的方式来“标记”,在代码的对象,以便在Chrome浏览器开发工具很容易地检索它,这样我能看到它的参考? – Hellium

+0

不幸的是,我不知道有任何简单的方法来找到参考。如果你知道,让我知道! :)除此之外,我将这个问题减小到最简单的形式:写一个非常简单的JavaScript的唯一的应用程序(不打字稿),看看它执行相同的方式。如果确实如此,那么我不确定你还能做什么。 – TheJim01

回答

0

尝试处理只是一切。我正在使用这段代码片段。它处理材料,纹理,3d对象。它遍历数组和普通对象。

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

与r85不兼容 – Displee