Android用のゲームを作成していますが、GCを実行すると数秒ごとに目立った一時停止が発生しています。私は割り当てを最小限に抑えました。割り当てトラッカーによる残りの割り当てはBitmap.createBitmap(..)
、onTouchEvent
、onKeyEvent
で作成されます。 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番目のビットマップは、以下の小さな鳥のためのものです。あなたはこの実装を見てみることをお勧めします、再利用可能な入力イベントのために
はい、事前に割り当てて両方を再利用する必要があります。提案が必要な場合は、現在の実装を表示することができます。 – mibollma
@mibollma:完了。だから、どのように私はそれを事前に割り当てて再利用するのですか? – SBoss