2017-06-01 61 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