我正在为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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,使用这个类的方法如下:
PoolObjectFactory<Enemy> factory = new PoolObjectFactory<Enemy>() {
public Enemy createObject() {
return new Enemy();
}
};
Pool<Enemy> enemyPool = new Pool<Enemy>(factory, 50);
Run Code Online (Sandbox Code Playgroud)
此方法的明显问题是您无法向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);
Run Code Online (Sandbox Code Playgroud)
但它更容易出错并且很烦人.我还可以使用伪值在createObject()方法中初始化Enemy对象,然后稍后手动设置它们,或者我可以为每个对象创建一个Pool类,但我真的不喜欢这样做.
有关如何改进此代码的任何建议?你如何与java游戏开发人员处理池对象以避免垃圾收集?非常感谢.
1) 您应该重写 PoolObjectFactory 中的 createObject 函数。
2) 您将需要一个initialize() 函数来实际设置每个EnemyObject 的参数。只需让 EnemyObject 的构造函数调用初始化函数即可。然后,当您从池中取出对象时,您应该只使用参数调用初始化,它应该可以完美工作。
归档时间: |
|
查看次数: |
1321 次 |
最近记录: |