我正在为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,花费的时间更短。
我可以做些什么来确保我的游戏顺利运行?
答案 0 :(得分:2)
首先,您在LogCat中看到的内容因设备而异。如果您确定GC不是来自您的应用程序,那么您绝对无法做任何事情。你总会发现GC在做什么。 确保你的代码保持清洁,非常精简。
另外,请记住,一般来说,在存在垃圾收集器的情况下,手动调用GC绝不是一个好习惯。 GC围绕启发式算法进行组织,这些算法在放置到自己的设备时效果最佳。手动调用GC通常会降低性能。
偶尔,在一些相对罕见的情况下,人们可能会发现某个特定的GC出错了,然后手动调用GC可以改善性能。这是因为实际上不可能实现“完美”的GC,它将在所有情况下以最佳方式管理内存。这种情况很难预测,并取决于许多微妙的实施细节。 “良好实践”是让GC独立运行;手动调用GC是一个例外情况,只有在实际出现性能问题后才能设想。
我不认为这是Android< = 2.2的缺陷。它是在更高版本上发生的吗?你测试过了吗?