5

我目前正在为 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 游戏开发人员如何处理池化对象以避免垃圾收集?非常感谢。

4

1 回答 1

1

1) 您应该覆盖 PoolObjectFactory 中的 createObject 函数。

2) 您将需要一个 initialize() 函数来实际设置每个 EnemyObject 的参数。只需让 EnemyObject 的构造函数调用初始化函数即可。然后,当您从池中取出对象时,您应该只使用您的参数调用初始化,它应该可以正常工作。

于 2012-07-08T20:42:08.467 回答