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