2011-07-05 1 views
3

Android用のゲームを作成していますが、GCを実行すると数秒ごとに目立った一時停止が発生しています。私は割り当てを最小限に抑えました。割り当てトラッカーによる残りの割り当てはBitmap.createBitmap(..)onTouchEventonKeyEventで作成されます。 Bitmap.createBitmap(..)はフレームごとに2回呼び出され、削除することはできません。イベントとビットマップでの事前割り当て

質問:ビットマップを作成する別の方法とイベントを読む方法はありますか?または、操作に必要なメモリーを事前に割り当てる方法と、そのメモリーを使用するように指示する方法。

InputHandlerクラス(リスナーが含まれています):

public class InputHandler { 

private ISwarmInput mGame; 

// Declare input types 
public static final int USE_TOUCH = 0; 
public static final int USE_MOTION = 1; 
public static final int USE_KEY = 2; 
public static final int USE_TOUCH_AND_KEY = 3; 

private int mInputType; 
public OrientationEventListener mOrientationListener; 
public OnTouchListener mTouchListener; 
public OnKeyListener mKeyListener; 

public InputHandler(Context context, ISwarmInput game) { 
    mGame = game; 
    mTouchListener = createTouchListener(); 
    mKeyListener = createKeyListener(); 
} 

public OrientationEventListener createTiltListener(Context context) { 
    return new OrientationEventListener(context) { 
     @Override 
     public void onOrientationChanged(int orientation) { 
      if (mInputType == USE_MOTION) { 
       mGame.setAngle(orientation); 
      } 
     } 
    }; 
} 

public OnTouchListener createTouchListener() { 
    return new OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event){ 
      if (mInputType == USE_TOUCH || mInputType == USE_TOUCH_AND_KEY) { 
       if (readPointIn(event.getX(), event.getY())) { 
        mGame.addNewPoint((int) event.getX(), 
          (int) event.getY()); 
       } 
      } 
      return true; 
     } 
    }; 
} 

public OnKeyListener createKeyListener() { 
    return new OnKeyListener() { 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if (mInputType == USE_KEY || mInputType == USE_TOUCH_AND_KEY) { 
       switch (keyCode) { 
       case KeyEvent.KEYCODE_DPAD_UP: 
        mGame.setAngle(-90); 
        break; 
       case KeyEvent.KEYCODE_DPAD_LEFT: 
        mGame.setAngle(180); 
        break; 
       case KeyEvent.KEYCODE_DPAD_DOWN: 
        mGame.setAngle(90); 
        break; 
       case KeyEvent.KEYCODE_DPAD_RIGHT: 
        mGame.setAngle(0); 
        break; 
       } 
      } 
      return false; 
     } 
    }; 
} 
} 

ビットマップ作成の部分

public void drawHead(Canvas canv) { 
    mat.reset(); 
    nextFrame(); 

    setRotationAndFlip(mat); 

    this.bmp = Bitmap.createBitmap(SPRITESHEET, Bird.mCurFrame * BIG_W[mUseBird], 0, 
      BIG_W[mUseBird], BIG_H[mUseBird], mat, true); 
    super.drawPlaceable(canv); 

    mat.preScale((float)0.6, (float)0.6); 
    this.bmp = Bitmap.createBitmap(SPRITESHEET, Bird.mCurFrame * BIG_W[mUseBird], 0, 
      BIG_W[mUseBird], BIG_H[mUseBird], mat, true); 
} 

ゲームは蛇に似たもので、あなたが鳥だと各ワームについてあなたが食べる小さな鳥があなたを休ませる。 2番目のビットマップは、以下の小さな鳥のためのものです。あなたはこの実装を見てみることをお勧めします、再利用可能な入力イベントのために

+0

はい、事前に割り当てて両方を再利用する必要があります。提案が必要な場合は、現在の実装を表示することができます。 – mibollma

+0

@mibollma:完了。だから、どのように私はそれを事前に割り当てて再利用するのですか? – SBoss

答えて

0

:あなたのビットマップを再利用することができるようにビットマップについてhttp://code.google.com/p/libgdx/source/browse/trunk/backends/gdx-backend-android/src/com/badlogic/gdx/backends/android/AndroidInput.java

...多分あなたは、いくつかのスプライトと同じサイズにする必要があります。

+0

リンクをありがとう、私はそれを見ていきます。同じサイズのスプライトを使用すると、どのように役立ちますか?割り当て(キャンバス、ペイント、ビットマップ)はBitmap.createBitmap(..)内部コードで行われます。 – SBoss

+0

あなたのケースでは助けにならないでしょう。だから私はあなたの選択肢が5°のステップや何かのような異なる回転の束を作成するか、Canvas.rotate()(これも遅いです)を使用することだと思います。 – mibollma

+0

私はイベントが問題ではなく、ビットマップを解決できないことに気付きました。助けてくれてありがとう。 – SBoss

関連する問題