2013-03-15 2 views
0

Я хочу знать, как работает Sprite Pool, так как я их не понимаю. То, что я пытаюсь сделать, это показать случайные спрайты каждый раз, когда пользователь прикасается к кнопке (я уже управляю элементом управления), но мой код кажется неправильным, потому что он снова показывает один и тот же спрайт снова и снова.Случайный спрайт с пулом Sprite

Это мой код:

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

Вау, это действительно помогает. Тогда мне действительно не нужен пул, так как у меня нет одинаковых спрайтов для загрузки. Но как удалить спрайт и загрузить новый, удалить снова и загрузить и т. Д., Не влияя на производительность? спасибо :) отредактирован: спрайты случайным образом сгенерированы, поэтому он не будет тем же спрайтом –

+0

«без влияния на производительность» хмм. Загрузка и удаление спрайтов влияет на производительность. На этом пути нет 100%.С яркой стороны небольшие спрайты не должны сильно влиять на производительность. –

+0

Хмм, я думаю, я буду искать обходной путь. Благодаря! –