我正在为Android编写游戏,其中有敌人飞过屏幕然后消失,被其他敌人取代。现在,这种情况发生得非常快,我的代码目前执行大量的内存分配和释放来创建和删除这些敌人对象,所以我试图找到一种方法来优化它。我从一本关于android游戏开发的书中获得了这个Pool类的实现:
public class Pool<T> {
public interface PoolObjectFactory<T> {
public T createObject();
}
private final List<T> freeObjects;
private final PoolObjectFactory<T> factory;
private int maxObjects;
public Pool(PoolObjectFactory<T> factory, int maxObjects) {
this.maxObjects = maxObjects;
this.factory = factory;
freeObjects = new ArrayList<T>(maxObjects);
}
public T newObject() {
T object = null;
if (freeObjects.isEmpty()) {
object = factory.createObject();
} else {
object = freeObjects.remove(freeObjects.size() - 1);
}
return object;
}
public void free(T object) {
if (freeObjects.size() < maxObjects) freeObjects.add(object);
}
}
现在,使用此类的方法如下:
PoolObjectFactory<Enemy> factory = new PoolObjectFactory<Enemy>() {
public Enemy createObject() {
return new Enemy();
}
};
Pool<Enemy> enemyPool = new Pool<Enemy>(factory, 50);
此方法的明显问题是您无法向createObject()方法输入任何参数,因此强制您使用在其构造函数中不带参数的类。这将迫使我重写大量代码,因为我使用的Enemy类需要几个不同的参数。我可以想到几个解决方法,比如这个:
PoolObjectFactory<Enemy> factory = new PoolObjectFactory<Enemy>() {
public Enemy createObject(Object... args) {
return new Enemy((Float)args[0], (Float)args[1]);
}
};
Pool<Enemy> enemyPool = new Pool<Enemy>(factory, 50);
但它更容易出错并且很烦人。我还可以使用伪值在createObject()方法中初始化Enemy对象,然后稍后手动设置它们,或者我可以为每个对象创建一个Pool类,但我真的不愿意这样做。
有关如何改进此代码的任何建议?你如何与java游戏开发人员处理池对象以避免垃圾收集?非常感谢。
答案 0 :(得分:1)
1)您应该覆盖PoolObjectFactory中的createObject函数。
2)你需要一个initialize()函数来实际设置每个EnemyObject的参数。只需让EnemyObject的构造函数调用initialize函数即可。然后,当您将对象从池中取出时,您应该使用您的参数调用initialize,它应该可以正常工作。