2012-12-17 73 views
12

我有一個很大的Mesh和MorphAnimMesh大場景。當網格被移除時,我想釋放內存。如果我知道這是最好的辦法:三js內存管理

for (var i = scene.children.length - 1; i >= 0 ; i --) { 
    var obj = scene.children[i]; 
    scene.remove(obj); 
    obj.deallocate(); 
    obj.geometry.deallocate(); 
    obj.material.deallocate(); 
    obj.material.map.deallocate(); 
} 

如果我在此之後檢查任務管理器的內存使用情況,沒有任何變化。 (試圖等待GC幾分鐘,但沒有任何內容。)Google Chrome內存快照顯示仍在那裏的對象。形狀目標在THREE.Geometry @ 1862203等

試圖將obj設置爲null,但仍然沒有減少內存。

任何想法我做錯了什麼?

它的水平和玩家可以從一個變到另一個遊戲。幾次更改後,內存使用量增加到非常高的水平。這就是爲什麼我想在級別更改之前從內存中刪除所有對象。

回答

-2

JavaScript內存管理完全由瀏覽器控制。你不能強制GC運行(你不應該能夠運行,因爲它已經很好的優化了)。

GC只會銷燬不再引用它們的對象;設置obj = null;並不實際銷燬該對象,而只是刪除該對象的引用。

如果您還有其他引用仍然處於打開狀態(或已附加DOM)的閉包中,那麼瀏覽器會爲了它們而保留該對象。

你應該閱讀perfection kills -- understanding delete,如果您使用Chrome,這看起來像一個很好的工具:leak finder for javascript

10

最有可能的,你需要添加一些或全部以下的:

geometry.dispose(); 
material.dispose(); 
texture.dispose(); 

查閱這些例子:

http://mrdoob.github.com/three.js/examples/webgl_test_memory.html

http://mrdoob.github.com/three.js/examples/webgl_test_memory2.html

three.js r.60

+0

試過這種被捕獲,但什麼都沒有改變。如果我在chrome對象中使用堆快照,則數組(例如:THREE.Geometry @ 1862203中的morphTargets)仍然存在,並且內存使用情況相同。 – user974250

+0

也許您在某處持有網格,紋理或材質的參考? – Neil

+0

關於這些例子的事情是他們不涉及紋理 –

-1

我嘗試了所有的dispose和deallocate方法,但都沒有成功。

然後我爲我的離子應用做了以下工作,它使用webgl渲染器渲染360圖像。

this.renderer = new THREE.WebGLRenderer({ antialias: true }); 
RicohView.prototype.stopRendering = function() { 
    this.canRender = false; 
    this.renderer.forceContextLoss(); 
    this.renderer.dispose(); 
    console.log('renderer disposed'); 
    cancelAnimationFrame(this.requestId); 
} 

的requestId是一項能夠從

this.requestId = requestAnimationFrame(render);