Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 事件和位图中的预分配_Android_Garbage Collection_Allocation - Fatal编程技术网

Android 事件和位图中的预分配

Android 事件和位图中的预分配,android,garbage-collection,allocation,Android,Garbage Collection,Allocation,我正在为Android编写一个游戏,当GC运行时,每隔几秒钟我就会有明显的停顿。我已将分配减少到最小值,剩余的分配(根据分配跟踪程序)仅由Bitmap.createBitmap(..)、一个onTouchEvent和一个onKeyEvent生成位图。createBitmap(..)每帧调用两次,无法删除 现在我的问题是:是否有其他方法读取事件和创建位图?还是一种预先分配操作所需内存的方法,以及一种告诉他们使用该内存的方法 InputHandler类(包含侦听器): public class In

我正在为Android编写一个游戏,当GC运行时,每隔几秒钟我就会有明显的停顿。我已将分配减少到最小值,剩余的分配(根据分配跟踪程序)仅由
Bitmap.createBitmap(..)
、一个
onTouchEvent
和一个
onKeyEvent
生成<代码>位图。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);
}

这个游戏类似于蛇,你是一只鸟,你吃的每一条虫子都会有一只小鸟在你身上游动。第二个位图用于以下较小的bird。

对于可重用的输入事件,您可能希望查看此实现:


关于位图。。。也许你应该使一些精灵的大小相同,这样你就可以重用你的位图。

是的,你需要预先分配并重用这两个精灵。如果需要建议,可能需要显示当前的实现。@mibollma:Done。那么,我该如何预分配和重用它呢?谢谢你的链接,我会浏览一下。使用相同大小的精灵会有什么帮助?分配(画布、绘画和位图)发生在bitmap.createBitmap(..)内部代码中。您是对的,它对您的情况没有帮助。所以我想你的选择是创建一系列不同的旋转,比如5°步或其他什么,或者使用Canvas.rotate()(速度也很慢)。我意识到事件不是问题所在,但无法解决位图。谢谢你的帮助。