2013-05-05 73 views
1

我使用onSceneTouchEvent對TMX地圖移動播放器:GLES2 TouchEventPool耗盡

@Override 
     public Scene onCreateScene() { 
... 
       mScene.setOnSceneTouchListener(this); 
} 

... 

@Override 
     public boolean onSceneTouchEvent(Scene pScene, final TouchEvent pSceneTouchEvent) { 

     switch(pSceneTouchEvent.getAction()) { 

     case TouchEvent.ACTION_DOWN: 

         mLastMotionX = pSceneTouchEvent.getX(); 
         mLastMotionY = pSceneTouchEvent.getY(); 

         break; 

     case TouchEvent.ACTION_MOVE: 

         mLastMotionX1 = pSceneTouchEvent.getX(); 
         mLastMotionY1 = pSceneTouchEvent.getY(); 

         SpeedVector(mLastMotionX, mLastMotionY, mLastMotionX1, 
             mLastMotionY1);       
         break; 

     case TouchEvent.ACTION_UP: 

         mLastMotionX2 = pSceneTouchEvent.getX(); 
         mLastMotionY2 = pSceneTouchEvent.getY(); 
         SpeedVectorStop(mLastMotionX, mLastMotionY, mLastMotionX2, 
             mLastMotionY2); 
       break;   
} 

       return false; 

     } 

... 

     public void SpeedVector(float x1, float y1, float x2, float y2) { 

       if ((Math.abs(x2 - x1) < 55) && (Math.abs(y2 - y1) < 55)) { 


         float r = (float) Math.sqrt(((x2 - x1) * (x2 - x1)) 
             + ((y2 - y1) * (y2 - y1))); 
         float rx = (x2 - x1)/r; 
         float ry = (y2 - y1)/r; 
         new Vector2(rx * 100, ry * 100); 
         new Vector2(x2, y2); 



         if (speedThread) { 
           mPlayerBody.setLinearVelocity(rx * 15, ry * 15); 
         } else 
           mPlayerBody.setLinearVelocity(rx * 5, ry * 5); 

       } 
     } 


public void SpeedVectorStop(float x1, float y1, float x2, float y2) { 
       if ((Math.abs(x2 - x1) < 10) && (Math.abs(y2 - y1) < 10)) { 
         mPlayerBody.setLinearVelocity(0, 0); 
       } 
     } 

而且現場有很多是追求玩家(簡單的AI)其他小精靈(敵人)的。他們的位置和速度根據與玩家的距離而變化。 因此,所有數據將在下一方法更新:

@Override 
         public final void onUpdate(final float pSecondsElapsed) { 
//some code 
} 

當我觸碰現場幾次 - AndEngine將在這裏崩潰 是一個logcat的:

05-05 17: 13:06.539:V/AndEngine(2676): org.andengine.input.touch.TouchEvent $ TouchEventPool was exhausted,2 item尚未回收。分配了1個。 05-05 17:13:06.539:V/AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler $ 1 已用盡,2個項目尚未回收。分配了1個。 05-05 17:13:06.559:V/AndEngine(2676): org.andengine.input.touch.TouchEvent $ TouchEventPool was exhausted,3 item還未回收。分配了1個。 05-05 17:13:06.559:V/AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler $ 1 已用盡,3件商品尚未回收。分配了1個。 05-05 17:13:06.579:V/AndEngine(2676): org.andengine.input.touch.TouchEvent $ TouchEventPool was exhausted,4 item還未回收。分配了1個。 05-05 17:13:06.579:V/AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler $ 1 已用盡,4件商品尚未回收。分配了1個。

任何人都遇到過這個問題?

的問題是非常緊迫和無解,但(被包含作爲TouchEvent類中的私有靜態成員TouchEventPool產生

回答

2

您的消息。

這將記錄呼叫由線136產生在GenericPool<T>類,但這不是一個問題,其實我收到他們太在我的應用程序。

這只是以通知發動機將撥出額外的TouchEvent,因爲他們被重用。

您可以通過調用TouchEventPool中的正確構造函數,public GenericPool(final int pInitialSize)構造函數或通過暴露public synchronized void batchAllocatePoolItems(final int pCount)(始終在TouchEventPool中),然後使用正確的參數在應用程序中調用它來增加啓動池。順便說一句,除非你存儲TouchEvent(你真的不應該!!如果你需要它,複製它!),這是一個信息消息,不會讓你的應用程序崩潰。

+0

但我怎麼能從類TouchEventPool調用抽象構造函數? – user2352679 2013-05-07 13:12:53

+0

也許: private static int pInitialSize; \t private static final TouchEventPool TOUCHEVENT_POOL = new TouchEventPool(pInitialSize); ... ... ... \t公共靜態最後一類TouchEventPool擴展GenericPool { \t \t // ==================== ======================================= \t \t //用於/從SuperClass /接口 \t \t // ============================================ =============== \t \t public TouchEventPool(final int pInitialSize) \t \t { \t \t \t super(pInitialSize); \t \t} \t \t @覆蓋 \t \t保護的TouchEvent onAllocatePoolItem(){ \t \t \t回新的TouchEvent(); \t \t} \t} – user2352679 2013-05-07 13:24:53

+0

您可以修改AndEngine TouchEvent文件,向TouchEventPool添加一個構造函數並從它調用super(所需的事件數)。但我必須補充說這不是你的崩潰的原因。這是AndEngine的標準信息。所以不要停止尋找錯誤;) – 2013-05-07 17:00:23