2012-05-30 92 views
3

在我當前的項目中,我使用Threejs來構建一個具有網格的關卡。所有與相機,場景,投影儀,渲染器等圖形的東西是在一個對象中完成的。出於測試目的,我想用不同的參數重置整個場景,例如不同的尺寸。當試圖用Three.js重置整個場景時性能下降

因爲我想測量一個算法的時間,我想要一個「全」重置。所以我目前的做法是刪除包含場景/畫布的div盒子並刪除具有threejs代碼的整個對象。在此之後,我爲圖形級別實例化一個新對象。不幸的是,連續10次這樣做會導致性能嚴重損失。

我還嘗試刪除scene.delete()場景中的所有網格物體,並在刪除整個物體之前刪除場景,渲染器等。但仍然是性能問題。

那麼,如何實現所有圖形webgl組件的整體重置而不會出現性能損失?

在此先感謝。

+0

你使用什麼瀏覽器?大約一個月後,我注意到Chrome瀏覽器的WebGL頁面變慢,這會在重新加載頁面時持續存在,如果關閉並重新打開該頁面,則會重置。 –

+0

是的,我在最新版本(19)中使用Chrome。但是當重新加載頁面時,我的性能問題會停止。作爲一箇中間解決方案,我現在爲我的對象寫了一個函數,它清除所有對象而不是刪除整個對象。這工作沒有顯着的性能下降,但它是很好的知道是否有辦法進行「全面」重置。 – DerDree

+0

renderer.deallocateObject可能在某處看起來? –

回答

1

兩個功能,可能會增加你的表現重置:每個場景中的對象obj,嘗試兩種:

scene.remove(obj); 
renderer.deallocateObject(obj); 
+2

R59 - obj.deallocate(); –

+0

感謝您的更新,吉姆! –

3

刪除一切與三會解決不了問題,因爲即使你的WebGLRenderer是刪除,它永遠不會釋放它的WebGL上下文,所以你最終會同時運行多個WebGL上下文。對於每個額外的實況環境,性能會降低。最終,會受到限制。

請參閱this question,以獲得釋放上下文的黑客方式。

由於您真的不需要重新創建上下文,因此釋放上下文不受three.js支持。在我的情況下,使用Angular與多個應用程序階段(其中一些使用WebGL,有些不使用),我只需在頁面級控制器中持久保存渲染器的實例,以便我可以在子控制器中訪問它,因此永遠不需要重新創建WebGLRenderer,也就是上下文。