带有雪碧池的随机精灵



我想知道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()方法将其扔回池中。

这一切的意义是什么?

首先请注意,我不需要做这些。相反,我可以在需要的时候实例化一头新奶牛,然后扔掉它。要理解的关键点是,当实例化一个新奶牛时,它有开销。它分配内存资源。等等。同样,当我处理一头牛时,它也有资源。在某种程度上,垃圾收集将不得不清理奶牛,这需要一些处理时间。

池化本质上只是一种回收形式。我知道我将来还会需要一头牛,所以我没有把这头牛永久地处理掉,而是把它放在池塘里,然后,当我需要一头牛的时候,这头牛就在我身边。没有涉及垃圾收集,因为池保留了额外的奶牛。实例化一头新奶牛更快,因为我并没有真正实例化一头新奶牛,奶牛已经在池中了(除非奶牛不在池中,那么它就会生成一头)。

了解池是一种优化形式也是很重要的。你不会通过池化获得新的功能;相反,您可以更巧妙地处理资源。我说有可能,是因为将对象池化并不总是有意义的。

我建议您避免为了共用而共用。换句话说,确保你在解决一个实际的问题。分析代码并找出真正的瓶颈在哪里。如果对象的创建或处置占用实时时间或内存,则可能需要启动池。把子弹集中起来是最好的机会。想象一下,你正在喷射成吨的子弹,制造新的子弹,处理旧的子弹。在这种情况下,您可以通过池化来获得真正的性能优势。

最新更新