Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试减少java游戏中的内存分配-用于迭代器_Java_Android_Proguard - Fatal编程技术网

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

尝试减少java游戏中的内存分配-用于迭代器,java,android,proguard,Java,Android,Proguard,偶尔我的游戏会因为垃圾收集而打嗝/掉帧。因此,我试图通过删除不必要的分配来减少这种情况 使用Eclipse中的分配跟踪器,我看到我的代码如下: for (IGameObject obj : mObjects) { //stuff } 正在分配迭代器: java.util.ArrayList$ArrayListIterator 24 bytes java.util.ArrayList iterator 由于mObjects是一个ArrayList,因此我可以轻松地更改发生这种情况

偶尔我的游戏会因为垃圾收集而打嗝/掉帧。因此,我试图通过删除不必要的分配来减少这种情况

使用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);
}
intsz=mObjects.size();
IGameObject gameObject=null;

对于(inti=0;i控制内存消耗的最佳方法是自己和在基本结构中进行分配

例如,您可以在一个简单的数组中变换ArrayList mObjects
IGameObject[]mObjects=new IGameObject[MAX\u GAME\u 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...
    }
 }

用于(i=0;iIs 24字节值得一次优化?即使你将其分配为23.5KB的1000倍。我认为你应该看看你的图形或其他重物!@Tecigo,正如他们所说,大小并不重要。游戏中的垃圾收集会导致打嗝/掉帧。最好的解决方案是删除不必要的分配,这只是其中之一在我试图删除的许多分配中。
 for(i=0;i<MAX_GAME_OBJECTS;i++){
    if( ! isObjAlive[i]){
        // use the setters to customize your object for the new role...
    }
 }