0

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();
    }
}

皆さんが私を助けてくれることを願っています、ありがとう:)

4

1 に答える 1

0

プールがどのように機能するかを理解してもらうために、私のアプリケーションから単純な牛のプールをお見せします。My 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);
}

}

プール アイテムを割り当てる (新しい牛を生成する) 方法と、牛をリサイクルする方法の 2 つの方法があることがわかります。牛が必要なときは、これらのメソッドのいずれも呼び出さずに、cowPool.obtainPoolItem() を呼び出します。プールに牛がいる場合は、牛を返します。そうでない場合は、onAllocatePoolItem() を呼び出して新しい牛を作成し、その牛を返します。特定の牛の処理が終わったら、recycle() メソッドを使用してプールに戻します。

このすべてのポイントは何ですか?

まず第一に、私はこれを行う必要がないことに注意してください。代わりに、必要なときに新しい牛をインスタンス化して、それを捨てることができます。理解すべき重要なポイントは、新しい牛をインスタンス化するときにオーバーヘッドがあるということです。メモリ リソースを割り当てます。などなど。同様に、牛を処分すると、それにも資源があります。ある時点で、ガベージ コレクションは牛をクリーンアップする必要がありますが、これには少し処理時間がかかります。

プーリングは本質的に、リサイクルの一形態にすぎません。将来また牛が必要になることはわかっているので、この牛を永久に処分するのではなく、プールに放り込みます。プールは余分な牛を保持しているため、ガベージ コレクションは関与しません。また、実際には新しい牛をインスタンス化していないため、新しい牛をインスタンス化する方が高速です。牛はプールに既に存在します (牛がそうでない場合を除き、プールを作成します)。

また、プーリングは最適化の一形態であることを理解することも重要です。プールによって新しい機能が得られるわけではありません。代わりに、リソースをよりスマートに処理できる可能性があります。オブジェクトをプールすることが常に意味があるとは限らないため、可能性があると言います。

プーリングのためだけにプーリングを避けることをお勧めします。つまり、実際の問題に対処していることを確認してください。コードのプロファイリングを行い、実際のボトルネックがどこにあるかを見つけます。オブジェクトの作成または破棄にリアルタイムまたはメモリがかかっている場合は、プーリングを開始することをお勧めします。プーリングの絶好の機会は弾丸です。大量の弾丸を散布し、新しい弾丸を作成し、古い弾丸を処分していると想像してください。このような場合、代わりにプーリングを行うことで、実際のパフォーマンス上の利点が得られる可能性があります。

お役に立てれば。

于 2013-03-15T18:52:26.247 に答える