2011-01-28 182 views
5

我想用JavaScript創建一個簡單的JavaScript遊戲引擎,但是我一般都會遇到一些JavaScript問題,我希望可以避免。除了JavaScript的整體性能欠佳之外,當使用WebGl進行渲染時,我每隔一秒就會週期性發生一次奇怪的停頓。我認爲這必須在JavaScript中使用GC進行。無論如何要儘量減少這些「口吃」?是否有任何我應該知道的常見做法,一種迫使至少部分垃圾收集發生在我可以控制的時間?JavaScript垃圾收集暫停

我知道這些都是簡單的問題,但我對JavaScript相當陌生,在因特網上搜索並沒有給我許多有用的信息。

+2

當然它可能是GC,但根據我的經驗,當我們將GC歸咎於某些事情時,事實證明我們在代碼中某處存在普通錯誤。 – Boldewyn 2011-01-28 10:31:51

回答

2

儘可能多地重複使用對象。如果您爲每個渲染幀創建數十個對象(如向量和矩陣),那麼您肯定會收到與GC相關的口吃。 因此,當您使用基於場景圖的方法渲染遊戲時,例如,您可能想要緩存場景圖節點中的對象。或者你可以使用Object Pool Pattern。在Java等其他語言中,此技術已被棄用,因爲對象創建和GC今天如此之快以至於對象池不再有用。但在JavaScript中它可能仍然有幫助。

我在去年寫過的JavaScript遊戲中遇到了GC-stutter問題,我通過重寫我的2D矢量引擎來解決問題,因此在幀渲染期間絕對不會創建新對象。對象只在場景建立或新場景節點添加時創建一次。但是場景的顯示和動畫創建絕對沒有新的對象。

你可能想看看我的2D引擎:

http://www.ailis.de/~k/hg/javascript/twodee/file/tip/src/main/javascript/twodee

你會發現,我在緩存靜態字段臨時需要向量和矩陣,而我使用的可變向量和矩陣類代替不可改變的現有矢量/矩陣被修改而不是在與它們進行數學運算時創建新的結果矢量/矩陣。