尝试减少java游戏中的内存分配-用于迭代器
偶尔我的游戏会因为垃圾收集而打嗝/掉帧。因此,我试图通过删除不必要的分配来减少这种情况 使用Eclipse中的分配跟踪器,我看到我的代码如下:尝试减少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,因此我可以轻松地更改发生这种情况
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 mObjectsIGameObject[]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...
}
}