由于垃圾收集,偶尔我的游戏会出现hicups / drop frames。所以我试图通过删除unnessasary分配来减少这种情况。
在Eclipse中使用分配跟踪器,我看到下面的代码:
for (IGameObject obj : mObjects) {
//stuff
}
分配迭代器:
java.util.ArrayList$ArrayListIterator 24 bytes java.util.ArrayList iterator
我可以轻松更改发生这种情况的所有地方,因为mObjects是ArrayList
。
虽然只是出于兴趣,但是会不会以某种方式将其优化为基本的for
循环?因为看起来很遗憾,我必须让我的代码更加冗长以避免这种分配。
答案 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...
}
}