2011-01-07 78 views
5

我一直在爲Android的遊戲工作,並在我的N1上進行調試。起初,表演並不完整。然後我開始清理所有分配以防止垃圾收集。這大大改善了事情,但我仍然看到一些垃圾收集發生,導致動畫短暫暫停。Android遊戲開發和垃圾收集

將頭髮拉出一段時間後,我注意到正在進行垃圾回收的進程ID(GC_FOR_MALLOC)不是我的進程ID。進程ID屬於「Android系統」和android.process.acore(通過使用市場上的「Android系統信息」應用程序確定)。 acore進程與桌面組件(稱爲數字時鐘)綁定。我卸載了小部件,幾乎在整個遊戲中都沒有任何停頓。 GC爲「Android系統」暫停了一個簡短的停頓。

對不起,長的解釋,但現在我的問題:

  1. 它是如何,其他遊戲不偶爾有停頓,由於系統進程的GC(東西了開發者的控制的)?
  2. 根據第一個問題,我該如何處理導致GC的不同應用程序,從而降低了我的流程並導致了我的遊戲中的打嗝?

我只是覺得有什麼我失蹤,因爲其他遊戲沒有這個問題。

謝謝

+1

如果你的應用程序對垃圾收集器很敏感,那麼你做錯了。 – Falmarri 2011-01-07 00:10:35

+0

你可能在http://gamedev.stackexchange.com/有更好的運氣,用於遊戲開發的具體問題。我不確定這有一個簡單的答案。你無法阻止gc,只是把它們降到最低。 2.3包含併發gc,但如果您想要定位較早的平臺,那麼這並不會有多大幫助。 – 2011-01-07 00:14:18

回答

3

你可以降低遊戲的幀率嗎?也許它正在使用100%的CPU,因此消耗CPU的其他任何東西都會使其滯後。這些設備的速度並不像普通個人電腦那麼快。您也可以考慮減少創建每個幀所需的CPU,以保持幀速率足夠高以保持平滑。

0
private static Bitmap GetNonTransparentBitmap(int Id) { 
    // no transparency 
    Drawable tmp = myContext.getResources().getDrawable(Id); 

    Bitmap retval = Bitmap.createBitmap(tmp.getMinimumWidth(), tmp.getMinimumHeight(), Bitmap.Config.RGB_565); 
    Canvas canvas = new Canvas(retval); 
    tmp.setBounds(0, 0, tmp.getMinimumWidth(), tmp.getMinimumHeight()); 
    tmp.draw(canvas); 
    return retval; 
}