其他进程调用GC会减慢我的游戏速度

时间:2013-03-17 23:00:13

标签: android garbage-collection

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

我检查了LogCat。有很多GC_FOR_MALLOC或GC_EXPLICIT。但是......不是来自我的过程的PID!我的游戏不会导致他们。它们是因为其他进程在后台运行而引起的。一些壁纸,小工具,收音机,电子邮件,天气检查和其他服务......

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

这是一个很大的Android< = 2.2架构缺陷吗? Android 2.3 introduces并发GC,花费的时间更短。

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

1 个答案:

答案 0 :(得分:2)

首先,您在LogCat中看到的内容因设备而异。如果您确定GC不是来自您的应用程序,那么您绝对无法做任何事情。你总会发现GC在做什么。 确保你的代码保持清洁,非常精简。

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

偶尔,在一些相对罕见的情况下,人们可能会发现某个特定的GC出错了,然后手动调用GC可以改善性能。这是因为实际上不可能实现“完美”的GC,它将在所有情况下以最佳方式管理内存。这种情况很难预测,并取决于许多微妙的实施细节。 “良好实践”是让GC独立运行;手动调用GC是一个例外情况,只有在实际出现性能问题后才能设想。

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