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

时间:2012-09-30 09:35:06

标签: java android proguard

由于垃圾收集,偶尔我的游戏会出现hicups / drop frames。所以我试图通过删除unnessasary分配来减少这种情况。

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

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

分配迭代器:

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

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

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

2 个答案:

答案 0 :(得分: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个字节。

答案 1 :(得分:0)

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

例如,你可以在一个简单的数组IGameObject[] mObjects = new IGameObject[MAX_GAME_OBJECTS];中转换你的ArrayList mObjects(你应该知道/计算你的游戏可以处理的最大对象数)。 此外,您应该重新使用这些对象。你可以保留一个数组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...
    }
 }