gpt4 book ai didi

Java 临时迭代器正在减慢我的 Android 游戏

转载 作者:搜寻专家 更新时间:2023-10-30 21:06:27 26 4
gpt4 key购买 nike

出于性能原因,此问题涉及 Java 中的内存管理:因为我正在将此程序开发为 Android 游戏,而内存 GC 会降低我的性能。所以到目前为止,我已经完成了大量工作,结果证明我在优化游戏内存使用方面做得很好,但我有一个问题:迭代器!

这是我正在做的:

  1. 开始游戏关卡。
  2. 启动分配跟踪器(这样我们会忽略所有在关卡运行期间会保留的分配;我有很多对象只在关卡开始时创建一次,它们不是问题所在)。
  3. 在关卡中做一些事情并获得分配。

我的分配是这样的:

466 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
465 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
464 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
463 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
461 24 java.util.AbstractList$SimpleListIterator 12 java.util.AbstractList iterator
456 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList iterator
454 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList iterator
453 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList iterator
452 24 java.util.ArrayList$ArrayListIterator 12 java.util.ArrayList iterator

所以在我的游戏运行时唯一分配的对象是迭代器!好的,那么现在修复它......我问的是什么代码导致了问题......这里是:

for (Segment side : listOfSides.getSides()) {
// do stuff
}

是的,事实证明 for-each 语法在幕后调用迭代器来填充每个元素。这完全有道理,也正是我所期望的,但我没有意识到它会如此可怕地累积并导致游戏性能问题。如果我能解决这个问题,那么无论在什么手机上,我的游戏都会像闪电一样运行。所以我的问题是:你会怎么做才能让所有这些临时迭代器都不会被创建,然后立即被丢弃,从而导致讨厌的 GC 运行?以不会使我的代码完全丑陋的方式这样做的奖励积分! (并且在 Android 上使用 ndk 不是一种选择)

附言我在想,对于我所有的 ArrayList,我可以开始使用 get(int i) 函数,因为它们是幕后的数组,我将用来索引的整数将被放置在堆栈而不是堆上。但是对于其他对象,如 HashMap 和 LinkedList,我不确定该怎么做。

最佳答案

ArrayList 和 LinkedList 允许您使用 get(int i) 遍历元素(请注意,LinkedList 可能会很慢,我不知道 get() 是如何实现的。)这是避免分配迭代器的推荐方法。如果您查看平台的源代码,您会注意到我们尽量避免使用 for-each 语法。

对于 HashMap,您可以使用 entrySet() 获取底层集合,然后调用 toArray(Object[]) 并传递一个足够大的预分配数组来容纳所有值。或者,看看您是否可以使用 Android 提供的各种 SparseArray 类。

关于Java 临时迭代器正在减慢我的 Android 游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11490240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com