安卓游戏开发与垃圾回收

5
我一直在为Android游戏进行开发和调试,使用N1进行调试。一开始性能不稳定。然后我开始清理所有的分配以防止垃圾回收。这大大改善了情况,但我仍然看到一些垃圾回收导致动画中出现非常短暂的暂停。
在一段时间里我非常苦恼,然后我注意到执行垃圾回收(GC_FOR_MALLOC)的进程ID不是我的进程ID。这些进程ID属于“Android System”和android.process.acore(通过使用市场上的“Android System Info”应用程序确定)。acore进程与名为数字时钟的桌面小部件相关联。我卸载了小部件,并几乎完整地完成了游戏而没有任何暂停。仅有一个非常短暂的暂停是由于“Android System”的GC引起的。
抱歉解释这么长,现在是我的问题:
  1. 其他游戏如何做到不会因系统进程的GC(开发者无法控制的事情)而偶尔暂停?
  2. 在第一个问题的基础上,我该如何处理其他应用程序引起的GC,从而降低我的进程速度并导致游戏出现问题?
我觉得其他游戏没有这个问题,可能是我遗漏了什么。
谢谢。

1
如果你的应用程序对垃圾收集器如此敏感,那么它肯定有问题。 - Falmarri
针对游戏开发相关问题,您可以尝试访问http://gamedev.stackexchange.com/,或许会有更好的运气。对于这个问题,我不确定是否有简单的答案。您无法完全防止垃圾回收,只能尽量减少其发生。2.3版本包含并发垃圾回收功能,但如果您想针对早期平台进行开发,则无法得到太多帮助。 - Cheryl Simon
2个回答

3
你能降低游戏的帧速率吗?或许它正在使用100%的CPU资源,所以任何其他消耗CPU资源的东西都会使其卡顿。这些设备远没有平均PC机快。你还可以尝试减少创建每一帧所需的CPU资源,以保持帧速率足够高,从而使游戏更加流畅。

你完全抓住了重点。我的游戏一直在使用100%的CPU。我解决这个问题最大的方法是改变背景绘制方式,不再处理透明度(如下函数)。我的CPU立即降温了。一旦CPU没有被占用,我就再也没有注意到垃圾回收了。谢谢。 - Steve0212
有点晚了,但我有一个类似的问题。除了在每个帧结束时简单地睡眠之外,你如何实际使用不到100%的CPU?你用什么工具来测量CPU使用率?此外,透明度/非透明度不是GPU用户而是CPU吗?谢谢! - Tenfour04
@TenFour04:根据定义,尽可能少地工作可以减少CPU的使用。有时这意味着使用不同的图像格式(特别是如果你有一个糟糕的GPU或者没有GPU,alpha通道会很昂贵),有时它意味着存储对物品的引用,这样你就不必每次都查找它......有时它意味着在你知道必须要做某事之前等待。具体情况各不相同,但归根结底就是“不要浪费CPU周期”。哦,而且休眠是一件好事 - 如果做得好的话,它可以保持帧率相对稳定。 - cHao

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;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接