带有精灵池的随机精灵

时间:2013-03-15 16:41:27

标签: android sprite andengine pool

我想知道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();
    }
}

希望你们能帮帮我,谢谢:)。

1 个答案:

答案 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()方法将它扔回池中。

这一切有什么意义?

首先请注意,我不必做任何此事。相反,我可以在我需要的时候实例化一头新牛,扔掉它。要理解的关键点是,当我实例化一头新牛时,这会产生开销。它分配内存资源。等等。同样,当我处理一头奶牛时,它也有资源。在某些时候,垃圾收集将不得不清理所述奶牛,这需要一点处理时间。

汇集基本上只是一种回收形式。我知道未来我将再次需要一头母牛,所以我不会永久性地处理这头牛,而是把它放在水池里,后来,当我需要一头母牛时,母牛就在我身边。不涉及垃圾收集,因为池正在保持额外的奶牛。并且实例化一头新牛的速度更快,因为我并没有真正实例化新的奶牛,奶牛已经存在于池中(除非奶牛没有,那么它就会产生奶牛)。

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

我建议你为了合并而避免合并。换句话说,确保您正在解决实际问题。描述您的代码并找出真正的瓶颈所在。如果对象的创建或处理是实时或内存,您可能想要开始汇集。汇集的绝佳机会是子弹。想象一下,你正在喷射大量的子弹,创造新的子弹并处理旧的子弹。在这种情况下,您可能会通过汇集来获得真正的性能优势。

希望这有帮助。