2011-01-07 171 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; 
}