我正在为Android平台上的交互式游戏进行性能优化。偶尔会出现由于垃圾回收而导致绘制和交互出现问题的情况。通常不到0.1秒,但在非常慢的设备上有时可能高达200毫秒。
我使用Android SDK中的ddms分析器来查找内存分配的来源,并将其从我的内部绘图和逻辑循环中删除。
最严重的问题出现在短循环中,例如:
for(GameObject gob : interactiveObjects)
gob.onDraw(canvas);
每次循环执行时都会分配一个迭代器,现在我正在使用数组(ArrayList
)来存储对象。如果我需要在内部循环中使用树或哈希表,我知道需要小心处理,甚至需要重新实现它们,而不是使用Java集合框架,因为我无法承受额外的垃圾回收。这可能会在我查看优先队列时出现。
我还遇到了问题,当我想要使用Canvas.drawText
显示分数和进度时。这是不好的。
canvas.drawText("Your score is: " + Score.points, x, y, paint);
因为字符串
、字符数组
和StringBuffer
将被分配到各个地方以使其正常工作。如果您有几个文本显示项,并且每秒运行帧60次,那么这些消耗将会增加并增加垃圾收集中断。我认为在这里最好的选择是保留char[]
数组,手动将您的int
或double
解码到其中,并将字符串连接到开头和结尾。如果有更好的解决方法,我很乐意听听。
我知道肯定还有其他人在处理这个问题。您是如何处理它的,您发现了什么陷阱和最佳实践,可以在Java或Android上进行交互式运行?这些gc问题足以让我想念手动内存管理,但没那么多。