我想知道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();
}
}
希望你们能帮帮我,谢谢:)。
答案 0 :(得分:0)
我将从我的应用程序中向您展示一个简单的奶牛池,让您了解泳池的工作原理。我的CowPool被用作生成CowCritters的来源(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()方法将它扔回池中。
这一切有什么意义?
首先请注意,我不必做任何此事。相反,我可以在我需要的时候实例化一头新牛,扔掉它。要理解的关键点是,当我实例化一头新牛时,这会产生开销。它分配内存资源。等等。同样,当我处理一头奶牛时,它也有资源。在某些时候,垃圾收集将不得不清理所述奶牛,这需要一点处理时间。
汇集基本上只是一种回收形式。我知道未来我将再次需要一头母牛,所以我不会永久性地处理这头牛,而是把它放在水池里,后来,当我需要一头母牛时,母牛就在我身边。不涉及垃圾收集,因为池正在保持额外的奶牛。并且实例化一头新牛的速度更快,因为我并没有真正实例化新的奶牛,奶牛已经存在于池中(除非奶牛没有,那么它就会产生奶牛)。
了解池化是一种优化形式也很重要。你没有通过汇集来获得新的功能;相反,您可以获得更智能的资源处理。我可能会说,因为汇总对象并不总是有意义的。
我建议你为了合并而避免合并。换句话说,确保您正在解决实际问题。描述您的代码并找出真正的瓶颈所在。如果对象的创建或处理是实时或内存,您可能想要开始汇集。汇集的绝佳机会是子弹。想象一下,你正在喷射大量的子弹,创造新的子弹并处理旧的子弹。在这种情况下,您可能会通过汇集来获得真正的性能优势。
希望这有帮助。