11

我正在为 Android >= 2.1 编写实时街机游戏。在游戏过程中,我不分配内存,不引诱 GC。因为如果 GC 调用,它需要处理器 70-200 毫秒。用户将此视为“哦,不,该游戏落后......”

我检查了 LogCat。有很多 GC_FOR_MALLOC 或 GC_EXPLICIT。但是......不是来自我的进程的PID!我的游戏没有引起他们。它们是由于其他进程在后台运行而引起的。一些壁纸、小部件、收音机、电子邮件、天气检查和其他服务......

我完全不明白。例如,当壁纸消失时,我想它的 onPause() 会被调用。因此,它应该停止所有线程并且当然不分配任何内存(或调用 System.gc())。也许它被错误地实施了?我不知道。但是有一些Android服务,也会时不时造成GC……很奇怪。

这是一个很大的 Android <= 2.2 架构缺陷吗?Android 2.3引入了并发 GC,耗时更少。

我可以做些什么来确保我的游戏能够顺利运行?

4

1 回答 1

2

首先,您在 LogCat 中看到的内容会因设备而异。如果您确定 GC 不是来自您的应用程序,那么您绝对无能为力。你总是会发现 GC 正在做……某事。确保你的代码保持干净和精简。

另外,请记住,一般来说,在存在垃圾收集器的情况下,手动调用 GC 绝不是好的做法。GC 是围绕启发式算法组织的,这些算法在留给自己的设备时效果最好。手动调用 GC 通常会降低性能。

有时,在一些相对罕见的情况下,人们可能会发现特定的 GC 出错了,然后手动调用 GC 可能会在性能方面有所改善。这是因为实际上不可能实现一个“完美”的 GC 来在所有情况下都以最佳方式管理内存。这种情况很难预测,并且取决于许多微妙的实现细节。“好的做法”是让 GC 自己运行;手动调用 GC 是一个例外,只有在适当地见证了实际性能问题之后才能设想。

我不认为这是 Android <= 2.2 上的缺陷。它发生在更高版本上吗?你测试过吗?

于 2013-03-22T13:25:50.873 回答