Java 如何从先前生成的池中回收项目

Java 如何从先前生成的池中回收项目,java,android,generics,andengine,sprite,Java,Android,Generics,Andengine,Sprite,我正在开发一个使用andengine的游戏,其中我使用了不同精灵的通用池 现在我的游戏类似于水果忍者,在游戏中,水果会在屏幕上弹出,但过了一段时间或15分钟后,游戏会变得很慢,因为我正在使用 TargetPool tPool; tPool = new TargetsPool(apple,watermelon,lemon,mango,tomato); target=tPool.onAllocatePoolItem(); tPool.onHandleRecycleItem(targe

我正在开发一个使用andengine的游戏,其中我使用了不同精灵的通用池 现在我的游戏类似于水果忍者,在游戏中,水果会在屏幕上弹出,但过了一段时间或15分钟后,游戏会变得很慢,因为我正在使用

  TargetPool tPool;
  tPool = new TargetsPool(apple,watermelon,lemon,mango,tomato);
  target=tPool.onAllocatePoolItem();
  tPool.onHandleRecycleItem(target);

 public class TargetsPool extends GenericPool<Sprite> {

private ITextureRegion mTextureRegion, mTextureRegion1,mTextureRegion2, mTextureRegion3,mTextureRegion4;

public TargetsPool(ITextureRegion pTextureRegion1,ITextureRegion pTextureRegion2,ITextureRegion pTextureRegion3,ITextureRegion pTextureRegion4,ITextureRegion pTextureRegion5) {
    if (pTextureRegion1 == null&&pTextureRegion2 == null) {

        throw new IllegalArgumentException(
                "The texture region must not be NULL");
    }
    mTextureRegion = pTextureRegion1;
    mTextureRegion1 = pTextureRegion2;
    mTextureRegion2 = pTextureRegion3;
    mTextureRegion3 = pTextureRegion4;
    mTextureRegion4 = pTextureRegion5;

}

@Override
protected Sprite onAllocatePoolItem() {
    Random r = new Random();
    int a =r.nextInt(5);
    //Log.e(Integer.toString(a),"a" );
    Sprite sprite;
    VertexBufferObjectManager getvertex = null;

    switch(a){
        case 0:
            sprite =new Sprite(0, 0, mTextureRegion,getvertex);
        break;
        case 1:
            sprite =new Sprite(0, 0, mTextureRegion1,getvertex);
            break;
        case 2:
            sprite =new Sprite(0, 0, mTextureRegion2,getvertex);
            break;
        case 3:
            sprite =new Sprite(0, 0, mTextureRegion3,getvertex);
            break;
        case 4:
            sprite =new Sprite(0, 0, mTextureRegion4,getvertex);
            break;
            default:sprite =new Sprite(0, 0, mTextureRegion,getvertex);
    }


    return sprite;
}

protected void onHandleRecycleItem(final Sprite target) {
    target.clearEntityModifiers();
    target.clearUpdateHandlers();
    target.setVisible(false);
    target.detachSelf();
    target.reset();

}

 }
TargetPool tPool;
tPool=新的TargetsPool(苹果、西瓜、柠檬、芒果、番茄);
target=tPool.onAllocatePoolItem();
t工具onHandleRecycleItem(目标);
公共类TargetsPool扩展了GenericPool{
私有ITextureRegion mTextureRegion、mTextureRegion 1、mTextureRegion 2、mTextureRegion 3、mTextureRegion 4;
公共目标spool(ITextureRegion pTextureRegion 1、ITextureRegion pTextureRegion 2、ITextureRegion pTextureRegion 3、ITextureRegion pTextureRegion 4、ITextureRegion pTextureRegion 5){
if(pTextureRegion1==null&&pTextureRegion2==null){
抛出新的IllegalArgumentException(
“纹理区域不得为空”);
}
mTextureRegion=pTextureRegion1;
mTextureRegion1=pTextureRegion2;
mTextureRegion2=pTextureRegion3;
mTextureRegion3=pTextureRegion4;
mTextureRegion4=pTextureRegion5;
}
@凌驾
受保护的精灵onAllocatePoolItem(){
随机r=新随机();
int a=r.nextInt(5);
//Log.e(整数toString(a),“a”);
雪碧雪碧;
VertexBufferObjectManager getvertex=null;
开关(a){
案例0:
精灵=新精灵(0,0,mTextureRegion,getvertex);
打破
案例1:
精灵=新精灵(0,0,mTextureRegion1,getvertex);
打破
案例2:
精灵=新精灵(0,0,mTextureRegion2,getvertex);
打破
案例3:
精灵=新精灵(0,0,mTextureRegion3,getvertex);
打破
案例4:
精灵=新精灵(0,0,mTextureRegion4,getvertex);
打破
默认值:精灵=新精灵(0,0,mTextureRegion,getvertex);
}
返回精灵;
}
handleRecycleItem上的保护空洞(最终精灵目标){
target.clearEntityModifiers();
target.clearUpdateHandlers();
target.setVisible(false);
target.self();
target.reset();
}
}

我想知道如何再次从池中回收目标项目,就像每次游戏变慢时我都会生成新的目标一样

这不是从
常规池访问项目的方式。不要自己调用
onLocatePoolItem()
onHandlerRecycleItem
。。。分别调用
obtainPoolIem()
recyclePoolItem()
,以利用池功能。您应该阅读。

为什么不存储
new Sprite()
s而不是始终创建它们?仅在它们不可用时创建一次。然后onAllocatePoolItem()可以简单地返回存储的精灵。这就是你想要的吗?PS(另一个技巧):考虑重写为
public TargetsPool(ITextureRegion…pTextureRegion)
,因为这样可以将任意数量的
ITextureRegion
对象作为数组传入。