我的滚动位图画布太慢而无法使用

pho*_*oft 4 android canvas bitmap

我正在学习为Android编程.我做了几个基本的游戏,但是为了学习,我想制作汽车驾驶游戏.我想到的最简单的方法是将汽车保持在屏幕中间并滚动背景以产生运动的幻觉.

作为计算引擎的实验,我创建了一个2048x1200位图,我从PNG加载.这将是地图.然后我创建一个1024x600的新位图,从我在屏幕上显示的地图中裁剪出来.我这样做,因为getWidth()和getHeight()给出了这些尺寸.我每次根据移动在屏幕上显示不同的裁剪.

不幸的是我觉得这个太慢了.如果我想让它变得平滑,那么这辆车必须以蜗牛的速度移动.我得到大约18fps.

我正在使用James Daniello的简单游戏循环

我还阅读了以下堆栈溢出文章,该文章说尽可能地将对象创建保留在主循环之外,我尽我所能.
如何在Android游戏中在屏幕上绘制大量位图而不会降低性能

同样有用的是Romain Guy的这篇文章,它将Bitmap保持为与屏幕相同的格式,以阻止它必须转换为在屏幕上显示,这是非常昂贵的.
位图质量,条带和抖动

在进入OpenGL之前,我想弄清楚Canvas和Bitmaps能达到的最佳效果.我是在限制,还是应该采取不同的做法?我发现只要一次滚动地图1px就可以获得18fps,以实现平滑滚动.

private Bitmap track;
private Bitmap visible;
private Point position;
private int fps = 0;
private long lastFpsTime = 0;
private int fpsCount = 0;
Paint pText;

public void Draw(Canvas c){
    visible = Bitmap.createBitmap(track, position.x + 512, position.y + 300, 512, 300);
    position.x++;
    c.drawBitmap(visible, 0,0, null);
    c.drawText("FPS: " + fps, 10, 10, pText);
}

public void Init(Resources resources) {
    // Load Map from track1.png
    track = Bitmap.createBitmap(2048, 1200, Bitmap.Config.RGB_565);
    Bitmap track1 = BitmapFactory.decodeResource(resources, R.drawable.track1);
    track = track1.copy(Bitmap.Config.RGB_565, true);
    position = new Point(0,0);

    //Setup the Text Paint Object
    pText = new Paint();
    pText.setColor(Color.WHITE);
    pText.setStyle(Style.FILL_AND_STROKE);
}

public void Update() {
    fpsCount++;

    if (System.currentTimeMillis() - lastFpsTime >= 1000){
        lastFpsTime = System.currentTimeMillis();
        fps = fpsCount;
        fpsCount = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

Rom*_*Guy 5

您正在绘制的每个帧上创建一个新的位图.这是非常昂贵的.您应该使用drawBitmap()的版本,该版本采用源矩阵和目标矩形.