java - 尝试减少 java 游戏中的内存分配 - 对于迭代器

标签 java android proguard

有时我的游戏会因为垃圾收集而出现问题/掉帧。所以我试图通过删除不必要的分配来减少这种情况。

在 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/

相关文章:

java - HBase 内存不足错误

java - Java同时访问同一个对象的不同成员

Android 设备上的 JavaScript/HTML/CSS 应用程序——非常慢

Android Youtube API JSON-C 使用 GSON 解析

Android Proguard 文本编码问题

android - 应用程序仅在 Release模式下崩溃,如何配置混淆器?

android - 使用仅在发布时使用 RxJava 的库时应用程序崩溃

java - 这个循环可以占用 100% 的 CPU 吗?

java - Apache Ace 可以用作 Maven 存储库吗?

java - println() 和 println (""之间的区别)