java - 在 Libgdx 中使用对象池

标签 java android libgdx

我正在创建一个使用 Entity 对象类的 Android 游戏,然后将其扩展为许多不同的类型(即敌人、子弹等)。有没有办法创建一个 Entity 类型的池,然后将获得的 Entity 对象转换为我在运行时需要的任何东西(比如子弹类型)?将实体作为参数传递给构造函数只会破坏池的目的,对吗?示例如下:

public class EntityPool extends Pool<Entity> { 


public EntityPool (int initialCapacity, int max) {
    super(initialCapacity, max);
}

protected PooledEntity newObject () {
    return new PooledEntity();
}

public Entity obtain (int objectType) {
    Entity ent = super.obtain();
    if (objectType==SOME_OBJECT_TYPE)
                //Do something to make ent into that object type
    return ent;
}

public class PooledEntity extends Entity {
    PooledEntity () {
        super(null, 0, 0);
    }

    public void free () {
        EntityPool.this.free(this);
    }
}

最佳答案

对象池的要点通常是为了避免系统分配和解除分配开销,并且要求您知道对要分配的每种类型实体的数量的“最坏情况”限制。因此,假设您的实体在生命周期和使用方面有很大不同,您可能希望为每个实体设置单独的池。 (您绝对可以像@zaske 的回答那样改进池。)

另一方面,如果你真的想要一个单一的Entity 池,并且你想在运行时自定义这些实体,你可以从使用 Entity 子类改为像这样:

class Entity {
   EntityCustomizer custom;
   ...
}

然后当从池中获取一个 Entity 时,你传入一个 BulletShip 或任何自定义对象:

public Entity obtain (int objectType) {
  Entity ent = super.obtain();
  if (objectType==SOME_OBJECT_TYPE)
    ent.custom = EntityCustomizer.SOME_OBJECT_TYPE_IMPL;
  return ent;
}

(我很确定这是一个众所周知的模式,我应该使用适当的语言来识别这些部分......)

总而言之,我认为每个实体类型的单独池是可行的方法,因为我的解决方法很老套(你正在用一堆编译时类型检查来换取一些运行时灵 active )。

关于java - 在 Libgdx 中使用对象池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13294757/

相关文章:

java - 菜单无法正常工作

java - libgdx 使用图像百分比

java - IntelliJ IDEA 无法解析 spring 导入的文件

android - 在通话期间播放音频,以便通话中的其他人可以听到

java - 强制下载PDF

android - 如何找到某个网站的JSON数据的链接

android - 已删除的图片在图库中仍然可见

java - Java 中的 MaxHeap 实现无法正常工作

java - 如果字段是另一个类,则访问 jSTL 中类的字段

java - 让 Logback 不*遵循类继承*