2012-01-06 85 views
1

我正在做一個快節奏的實時 Android遊戲,並且一切都很好,但遊戲開始時的頭幾秒很滯後,因爲垃圾收集器在加載線程後清理。當然,玩家可以等待幾秒鐘(比如10+秒),因爲玩完後它開始運行非常流暢,但看起來真的很難看,並且感覺遊戲很麻煩。在開始使用Java之前等待GC完成?

有沒有一種方法(或技術)來告訴它何時啓動遊戲的安全,以便垃圾收集器在實時部分一開始就不會開始瘋狂?沒有破壞的東西,大的加載線程不能被減少很多。

+1

「非常滯後,因爲垃圾收集器在加載線程後清理。」 - 這並不是說你在加載過程中攪動了內存,還是僅僅是加載時間?如果前者,你能避免的是什麼? – 2012-01-06 00:28:58

+0

@Mitch:它表明加載器使用了很多對象(或者一些大對象)。直到初始化完成,可能都不符合收集條件。 – cHao 2012-01-06 00:33:30

+0

@cHao:我很好奇爲什麼裝載機需要很多對象? – 2012-01-06 00:37:14

回答

3

這似乎是System.gc()可能有所幫助的情況。它告訴系統,這將是收集垃圾的好時機。根據文檔,

當控制從方法調用返回時,Java虛擬機已盡最大努力從所有被丟棄的對象中回收空間。

該文檔還表示,雖然該方法「建議」的對象被收集 - 那就是,誰也不能保證它會幫助,特別是如果你仍然有一些參考squirreled了。如果確實有效,它只會收集運行代碼中根本無法訪問的對象,包括運行時。 (例如,該加載程序線程不符合收集直到它已完成運行您的代碼沒有更多的引用它。)

1

您可以(至少根據從該方法返回之前官方的JavaDoc here,光潔度和),你開始遊戲手動強制垃圾收集器運行的權利之前運行System.gc()。然而,總的來說,GC是不確定的,不能保證它不會再次運行,或者對於這個問題,System.gc()的呼叫什麼都不會做。

+1

真的,但[這個問題](http://stackoverflow.com/questions/3117429/garbage-collector-in-android)似乎表明System.gc()確實在android上做了一些事情,我認爲這是一個非常合法的案例來運行GC。它當然不會受傷。 – 2012-01-06 00:26:13

1

如果您深入研究了這一點,您可能會發現很多(甚至大多數)「遲鈍」不是GC的錯。我懷疑這主要是由於JIT編譯。調用System.gc()可以改善事情,但我懷疑它會完全消除這種延遲。

+0

我不認爲這就是問題,因爲當發生LAGG,我的日誌顯示一堆線即說:「GC_CONCURRENT ......等等等等等等......」而那些停止展示了LAGG消失後:\編輯:另外,我只是在開始遊戲後纔開始注意到lagg變得越來越複雜,我不得不越來越多地加載加載函數。它一開始並沒有落後這麼多 – AlexRamallo 2012-01-06 04:15:35

相關問題