有时我的游戏会因为垃圾收集而出现问题/掉帧。所以我试图通过删除不必要的分配来减少这种情况。
在 Eclipse 中使用分配跟踪器,我看到我的代码如下:
for (IGameObject obj : mObjects) {
//stuff
}
正在分配一个迭代器:
java.util.ArrayList$ArrayListIterator 24 bytes java.util.ArrayList iterator
由于 mObjects 是一个 ArrayList
,所以我可以轻松更改所有发生这种情况的地方。
只是出于兴趣,proguard 或 jit 会以某种方式将其优化为基本的 for
循环吗?看起来很遗憾,我不得不让我的代码更冗长以避免这种分配。
最佳答案
好吧,正如人们所说,除非真的是一个问题,否则不要进行优化,但始终存在:
int sz = mObjects.size();
IGameObject gameObject = null;
for (int i=0;i<sz;i++) {
gameObject = mObjects.get(i);
}
在这种情况下,您只是按索引循环。对于 ArrayList 这非常有效(从速度的角度来看可能与迭代器一样高效)。然而,如果你在某个时候放入一个 LinkedList,那么对于大型列表来说它就会变得糟糕,因为 .get(index) 对于 LinkedList 来说非常低效。
除非你真的有内存问题,否则我不会担心额外的 24 个字节。
关于java - 尝试减少 java 游戏中的内存分配 - 对于迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12660208/