Предварительное распределение в событиях и растровых изображениях - PullRequest
3 голосов
/ 05 июля 2011

Я пишу игру для Android, и у меня появляются заметные паузы каждые несколько секунд, когда GC запускается. Я сократил ассигнования до минимума, и единственные оставшиеся выделения (согласно Allocation Tracker) создаются Bitmap.createBitmap(..), onTouchEvent и onKeyEvent. Bitmap.createBitmap(..) вызывается дважды за кадр и не может быть удален.

Теперь на мой вопрос: Есть ли альтернативный способ чтения событий и другой способ создания растровых изображений? Или способ предварительно выделить память, необходимую для операций, и способ сказать им, чтобы использовать это?

Класс 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);
}

Игра похожа на змею, вы - птица, и за каждого съеденного червя вы получаете маленькую птицу, которая следует за вами. Второе растровое изображение предназначено для следующей более мелкой птицы.

1 Ответ

0 голосов
/ 05 июля 2011

Для многократно используемых входных событий вы можете взглянуть на эту реализацию: http://code.google.com/p/libgdx/source/browse/trunk/backends/gdx-backend-android/src/com/badlogic/gdx/backends/android/AndroidInput.java

Относительно растровых изображений ... возможно, вам следует сделать несколько спрайтов одинакового размера, чтобы вы могли повторно использовать свое растровое изображение.

...