2013-03-17 80 views
11

我正在为Android> = 2.1编写实时街机游戏。在游戏过程中,我不会分配内存,不会引诱GC。如果GC调用,则需要70-200ms的处理器。用户将此视为“哦,不,那场比赛是落后的......”其他进程调用GC会减慢我的游戏速度

我检查了LogCat。有很多GC_FOR_MALLOC或GC_EXPLICIT。但是...不是来自我的过程的PID!我的比赛不会造成他们。它们是由于其他进程在后台运行造成的。一些壁纸,小工具,收音机,电子邮件,天气检查和其他服务...

我不完全理解它。我想,当例如壁纸消失时,它的onPause()被调用。所以,它应该停止它的所有线程,并且肯定不会分配任何内存(或者调用System.gc())。也许这是错误的实施?我不知道。但也有一些Android服务,这也导致GC不时......这很奇怪。

这是一个大的Android < = 2.2架构瑕疵? Android 2.3 introduces并发GC,需要更少的时间。

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

回答

2

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

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

偶尔,在一些比较罕见的情况下,人们可能会发现特定的GC出错了,然后手动调用GC可能会改善性能。这是因为不可能实现一个“完美”的GC,它将在所有情况下优化管理内存。这种情况很难预测,并取决于许多细微的实施细节。 “好的做法”是让GC自行运行;对GC的手动呼叫是例外情况,只有在实际性能问题得到适当证实后才能设想。

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

+0

为什么你不相信?是的,我已经在2.2和4.1上测试过了。 2.2上的行为就像我所描述的那样。正如我所提到的那样,在4.1中,有一个并发GC,这使得这个问题不那么严重。 – 2013-03-22 13:49:39