我想知道Sprite Pool是如何工作的,因为我真的不了解它们。我试图做的是每次用户触摸按钮时显示随机精灵(我已经管理了控件),但我的代码似乎不正确,因为它只能一次又一次地显示相同的精灵。
这是我的代码:
public class SpritePool extends GenericPool<Sprite> {
private ITextureRegion mTexture1, mTexture2, mTexture3, mTexture4, mTexture5;
private VertexBufferObjectManager mVertexBufferObjectManager;
private Sprite sprite = null;
public SpritePool(ITextureRegion pTextureRegion1, ITextureRegion pTextureRegion2, ITextureRegion pTextureRegion3
, ITextureRegion pTextureRegion4, ITextureRegion pTextureRegion5, VertexBufferObjectManager pVerTexBufferObjectManager){
this.mTexture1 = pTextureRegion1;
this.mTexture2 = pTextureRegion2;
this.mTexture3 = pTextureRegion3;
this.mTexture4 = pTextureRegion4;
this.mTexture5 = pTextureRegion5;
this.mVertexBufferObjectManager = pVerTexBufferObjectManager;
}
@Override
protected Sprite onAllocatePoolItem() {
YesOrNoActivity.setRoll_1(MathUtils.RANDOM.nextInt(5) + 1);
switch(YesOrNoActivity.getRoll_1()){
case 1:
sprite = new Sprite(0, 0, this.mTexture1, this.mVertexBufferObjectManager);
break;
case 2:
sprite = new Sprite(0, 0, this.mTexture2, this.mVertexBufferObjectManager);
break;
case 3:
sprite = new Sprite(0, 0, this.mTexture3, this.mVertexBufferObjectManager);
break;
case 4:
sprite = new Sprite(0, 0, this.mTexture4, this.mVertexBufferObjectManager);
break;
case 5:
sprite = new Sprite(0, 0, this.mTexture5, this.mVertexBufferObjectManager);
break;
}
return sprite;
}
public synchronized Sprite obtainPoolItem(final float pX, final float pY) {
Sprite sprite = super.obtainPoolItem();
sprite.setPosition(pX, pY);
sprite.setVisible(true);
sprite.setIgnoreUpdate(false);
sprite.setColor(1,1,1);
return sprite;
}
@Override
protected void onHandleRecycleItem(Sprite pItem) {
super.onHandleRecycleItem(pItem);
pItem.setVisible(false);
pItem.setIgnoreUpdate(true);
pItem.clearEntityModifiers();
pItem.clearUpdateHandlers();
}
}
希望你们能帮助我,谢谢:)
我将从我的应用程序中展示一个简单的奶牛池,让您了解池是如何工作的。我的奶牛池被用作生成奶牛动物的来源(NPC奶牛四处走动,吃草,通常做你期望从奶牛身上看到的事情)。下面是代码:
public class CowPool extends GenericPool<CowCritter> {
private final String TAG = this.getClass().getSimpleName();
public CowPool() {
super();
}
@Override
protected CowCritter onAllocatePoolItem() {
return new CowCritter();
}
protected void recycle(CowCritter cow) {
this.recyclePoolItem(cow);
}
}
您将看到有两个方法,一个分配池项(生成一个新奶牛),另一个回收奶牛。当我需要奶牛时,我不调用这两个方法中的任何一个,而是调用cowPool.obtainPoolItem()。如果池中有一头牛,它将返回这头牛。如果没有,它将调用onAllocatePoolItem(),创建一个新的奶牛,并返回该奶牛。当我处理完给定的奶牛后,我使用recycle()方法将其扔回池中。
这一切的意义是什么?
首先请注意,我不需要做这些。相反,我可以在需要的时候实例化一头新奶牛,然后扔掉它。要理解的关键点是,当实例化一个新奶牛时,它有开销。它分配内存资源。等等。同样,当我处理一头牛时,它也有资源。在某种程度上,垃圾收集将不得不清理奶牛,这需要一些处理时间。
池化本质上只是一种回收形式。我知道我将来还会需要一头牛,所以我没有把这头牛永久地处理掉,而是把它放在池塘里,然后,当我需要一头牛的时候,这头牛就在我身边。没有涉及垃圾收集,因为池保留了额外的奶牛。实例化一头新奶牛更快,因为我并没有真正实例化一头新奶牛,奶牛已经在池中了(除非奶牛不在池中,那么它就会生成一头)。
了解池是一种优化形式也是很重要的。你不会通过池化获得新的功能;相反,您可以更巧妙地处理资源。我说有可能,是因为将对象池化并不总是有意义的。
我建议您避免为了共用而共用。换句话说,确保你在解决一个实际的问题。分析代码并找出真正的瓶颈在哪里。如果对象的创建或处置占用实时时间或内存,则可能需要启动池。把子弹集中起来是最好的机会。想象一下,你正在喷射成吨的子弹,制造新的子弹,处理旧的子弹。在这种情况下,您可以通过池化来获得真正的性能优势。