由于性能原因,这个问题涉及 Java 中的内存管理:因为我正在将此程序开发为 Android 游戏,而内存 GC 会扼杀我的性能。所以到目前为止我已经做了很多工作,结果证明我在优化游戏的内存使用方面做得很好,但是我有一个问题:迭代器!
这是我正在做的事情:
- 开始游戏关卡。
- 启动分配跟踪器(这样一来,只要关卡运行,我们就会忽略所有将保留的分配;我有很多对象只在关卡开始时创建一次,它们不是问题)。
- 在关卡中做一些事情并获得分配。
我的分配充满了这个:
466 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList 迭代器
465 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList 迭代器
464 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList 迭代器
463 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList 迭代器
461 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList 迭代器
456 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList 迭代器
454 24 java.util.AbstractList util.ArrayList$ArrayListIterator 12 java.util.ArrayList 迭代器
453 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList 迭代器
452 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList 迭代器
所以我的游戏运行时唯一分配的对象是迭代器!好的,现在修复它......是什么代码导致了我问的问题......这里是:
for (Segment side : listOfSides.getSides()) {
// do stuff
}
是的,事实证明 for-each 语法在后台调用迭代器来填充每个元素。这是完全合理的,也正是我期望它做的,但我没有意识到它会如此可怕地建立起来并导致游戏性能问题。如果我能摆脱这个问题,那么无论在什么手机上,它都会让我的游戏像闪电一样运行。所以我的问题是:你会怎么做才能使所有这些临时迭代器都没有被创建然后立即被丢弃,从而导致讨厌的 GC 运行?这样做的好处不会使我的代码变得完全丑陋!(并且不能在 Android 上使用 ndk)
PS 我在想,对于我所有的 ArrayList,我可以开始使用 get(int i) 函数,因为它们是幕后的数组,而我将用来索引的整数将被放置在堆栈上而不是堆上。但是对于像 HashMap 和 LinkedList 这样的其他对象,我不确定该怎么做。