2013-03-15 10 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

와우, 정말 도움이됩니다. 그런 다음로드 할 스프라이트가 거의 없기 때문에 풀링이 실제로 필요하지 않습니다. 하지만 스프라이트를 제거하고 새 스프레드 시트를로드하고, 다시 제거하고,로드하는 등 성능에 영향을주지 않으면 서 어떻게해야합니까? 덕분에 :) 편집 : 스프라이트가 무작위로 생성됩니다, 그래서 그것은 동일한 스프라이트 –

+0

"성능에 영향을주지 않고"흠. 스프라이트로드 및 제거는 성능에 영향을줍니다. 100 % 해결 방법은 없습니다.밝은면에서 작은 스프라이트는 성능에 큰 영향을 미치지 않습니다. –

+0

흠 좋습니다. 문제 해결 방법을 찾아 보겠습니다. 감사! –

관련 문제