2

由于垃圾收集,我的游戏有时会出现打嗝/丢帧。所以我试图通过删除不必要的分配来减少这种情况。

在 Eclipse 中使用分配跟踪器,我看到我的代码如下:

for (IGameObject obj : mObjects) {
  //stuff
}

正在分配一个迭代器:

java.util.ArrayList$ArrayListIterator   24 bytes    java.util.ArrayList iterator

我可以轻松更改所有发生这种情况的地方,因为 mObjects 是ArrayList.

只是出于兴趣,proguard 或 jit 会以某种方式将其优化为基本for循环吗?看起来很遗憾,我必须让我的代码更冗长以避免这种分配。

4

2 回答 2

1

好吧,正如人们所说,除非确实存在问题,否则不要优化,但总有:

int sz = mObjects.size();
IGameObject gameObject = null;
for (int i=0;i<sz;i++) {
    gameObject = mObjects.get(i);
}

在这种情况下,您只是按索引循环。对于 ArrayList 这非常有效(从速度的角度来看,可能与迭代器一样有效)。但是,如果您在某个时候放入 LinkedList,那么对于大型列表来说,它会变得很糟糕,因为 .get(index) 对于 LinkedList 来说是非常无能的。

除非你真的有内存问题,否则我不会担心额外的 24 个字节。

于 2012-09-30T17:19:49.880 回答
0

控制内存消耗的最佳方法是自己和在基本结构中进行分配。

例如,您可以将 ArrayList mObjects 转换为一个简单的数组IGameObject[] mObjects = new IGameObject[MAX_GAME_OBJECTS];(您应该知道/计算您的游戏可以处理的最大对象数是多少)。此外,您应该重新使用这些对象。您可以保留一个数组boolean[] isObjAlive = new boolean[MAX_GAME_OBJECTS];(与 mObjects 相同的维度),这将有助于首先了解您不再显示哪些对象,其次,如果该对象可重用:

 for(i=0;i<MAX_GAME_OBJECTS;i++){
    if(isObjAlive[i]){
        // draw the object or anything else...
    }
 }

重用:

 for(i=0;i<MAX_GAME_OBJECTS;i++){
    if( ! isObjAlive[i]){
        // use the setters to customize your object for the new role...
    }
 }
于 2012-10-01T06:14:05.233 回答