2013-03-15 175 views
0

我想知道雪碧池是如何工作的,因为我真的不明白他们。 我试图做的是每次用户触摸按钮时显示随机精灵(我已经管理控件),但我的代码看起来不正确,因为它只是再次显示相同的精灵。随机雪碧与雪碧池

这是我的代码:

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

我要告诉你一个简单的牛池从我的应用程序可以给你出个主意这些泳池如何运作。我的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()方法将它扔回池中。

这是什么意思?

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

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

重要的是还要了解,池化是一种优化形式。你没有通过合并获得新的功能;相反,你正在获得可能更聪明的资源处理。我说可能,因为它并不总是有意义的集合对象。

我建议你避免只为游泳池的缘故。换句话说,确保你正在解决一个实际问题。剖析您的代码并找出真正的瓶颈所在。如果创建或处理对象需要实时或记忆,则可能需要开始合并。一个完美的游泳池机会将是子弹。想象一下,你正在喷射大量的子弹,创造新的子弹并处理旧的子弹。在这种情况下,您可以通过合并来获得真正的性能优势。

希望这会有所帮助。

+0

哇,这真的有帮助。然后我并不需要池,因为我没有太多相同的精灵来加载。但是,如何删除精灵并加载新精灵,再次删除和加载等,而不会影响性能?感谢:) 编辑:精灵是随机产生的,所以它不会是相同的精灵 – 2013-03-15 19:47:42

+0

“不影响性能”嗯。加载和删除精灵会影响性能。没有100%的解决办法。光明的一面,小精灵不应该太多地影响性能。 – 2013-03-15 20:00:45

+0

嗯好吧,我想我会寻找解决方法。谢谢! – 2013-03-15 20:03:15