2013-03-17 48 views
11

我正在爲Android> = 2.1編寫實時街機遊戲。在遊戲過程中,我不會分配內存,不會引誘GC。如果GC調用,則需要70-200ms的處理器。用戶將此視爲「哦,不,那場比賽是落後的......」其他進程調用GC會減慢我的遊戲速度

我檢查了LogCat。有很多GC_FOR_MALLOC或GC_EXPLICIT。但是...不是來自我的過程的PID!我的比賽不會造成他們。它們是由於其他進程在後臺運行造成的。一些壁紙,小工具,收音機,電子郵件,天氣檢查和其他服務...

我不完全理解它。我想,當例如壁紙消失時,它的onPause()被調用。所以,它應該停止它的所有線程,並且肯定不會分配任何內存(或者調用System.gc())。也許這是錯誤的實施?我不知道。但也有一些Android服務,這也導致GC不時......這很奇怪。

這是一個大的Android < = 2.2架構瑕疵? Android 2.3 introduces併發GC,需要更少的時間。

我能做些什麼來確保我的遊戲順利運行?

回答

2

首先,您在LogCat中看到的內容將因設備而異。如果您確定GC不是來自您的應用程序,那麼您絕對無法做到。你總會發現GC在做...什麼的。 確保你保持你的代碼清潔和非常精簡。

另外,請記住,一般來說,在存在垃圾回收器的情況下,手動調用GC永遠不是好習慣。 GC是圍繞啓發式算法組織的,當離開自己的設備時,這些啓發式算法效果最好。手動調用GC通常會降低性能。

偶爾,在一些比較罕見的情況下,人們可能會發現特定的GC出錯了,然後手動調用GC可能會改善性能。這是因爲不可能實現一個「完美」的GC,它將在所有情況下優化管理內存。這種情況很難預測,並取決於許多細微的實施細節。 「好的做法」是讓GC自行運行;對GC的手動呼叫是例外情況,只有在實際性能問題得到適當證實後才能設想。

我不認爲這是Android上的缺陷< = 2.2。它發生在更高版本上嗎?你測試過了嗎?

+0

爲什麼你不相信?是的,我已經在2.2和4.1上測試過了。 2.2上的行爲就像我所描述的那樣。正如我所提到的那樣,在4.1中,有一個併發GC,這使得這個問題不那麼嚴重。 – 2013-03-22 13:49:39