如何避免 Java 游戏中的垃圾回收延迟?(最佳实践)[已关闭]
我正在为Android平台调整Java中的交互式游戏的性能。偶尔会在垃圾回收的绘制和交互方面遇到一些小问题。通常它不到十分之一秒,但有时在非常慢的设备上它可以大到200毫秒。
我正在使用ddms分析器(Android SDK的一部分)来搜索我的内存分配来自哪里,并从我的内部绘图和逻辑循环中删除它们。
最糟糕的罪犯是短循环,比如,
for(GameObject gob : interactiveObjects)
gob.onDraw(canvas);
每次执行循环时,都会分配一个。我现在正在为我的对象使用数组()。如果我想要内部循环中的树或哈希,我知道我需要小心甚至重新实现它们,而不是使用Java Collections框架,因为我负担不起额外的垃圾回收。当我查看优先级队列时,可能会出现这种情况。iterator
ArrayList
我也遇到了麻烦,我想使用显示分数和进度。这很糟糕,Canvas.drawText
canvas.drawText("Your score is: " + Score.points, x, y, paint);
因为,数组和将被分配到所有以使其工作。如果您有一些文本显示项目,并且每秒运行框架60次,则开始累积并会增加垃圾回收的打嗝。我认为这里最好的选择是保留数组并手动解码或手动将其解码,并将字符串连接到开头和结尾。我想听听是否有更干净的东西。Strings
char
StringBuffers
char[]
int
double
我知道一定还有其他人在那里处理这个问题。您如何处理它,您发现在Java或Android上交互式运行的陷阱和最佳实践是什么?这些gc问题足以让我错过手动内存管理,但不是很多。