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

Android 我的滚动位图画布太慢,无法使用,android,canvas,bitmap,Android,Canvas,Bitmap,我正在学习为Android编程。我已经做了一些基本的游戏,但是为了学习,我想做一个汽车驾驶游戏。我想做到这一点的最简单的方法是让汽车保持在屏幕中央,滚动背景以产生运动的幻觉。< /P> 作为了解引擎的一个实验,我创建了一个2048x1200位图,从PNG加载。这就是地图。然后,我创建了一个新的位图,它是从我在屏幕上显示的贴图中裁剪出来的1024x600。我这样做是因为getWidth()和getHeight()给出了这些维度。我每次都会根据屏幕上显示的移动情况进行不同的裁剪 不幸的是,我发现这太

我正在学习为Android编程。我已经做了一些基本的游戏,但是为了学习,我想做一个汽车驾驶游戏。我想做到这一点的最简单的方法是让汽车保持在屏幕中央,滚动背景以产生运动的幻觉。< /P> 作为了解引擎的一个实验,我创建了一个2048x1200位图,从PNG加载。这就是地图。然后,我创建了一个新的位图,它是从我在屏幕上显示的贴图中裁剪出来的1024x600。我这样做是因为getWidth()和getHeight()给出了这些维度。我每次都会根据屏幕上显示的移动情况进行不同的裁剪

不幸的是,我发现这太慢,无法使用。如果我想让汽车平稳,它就必须以蜗牛般的速度行驶。我的速度大约是18fps

我正在使用

我还阅读了下面的stack overflow文章,文章中说要尽可能地将对象创建排除在主循环之外,我正在尽我所能做到这一点。

罗曼·盖伊(Romain Guy)的这篇文章也很有用,它让位图保持与屏幕相同的格式,以防止位图被转换为显示在屏幕上,这是非常昂贵的。

在我转到OpenGL之前,我想找出我能用画布和位图实现的最佳效果。我是否处于极限,还是应该做些不同的事情?我发现,为了平滑滚动,一次滚动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;
    }
}

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

您可以使用两种策略之一:矩阵或剪切矩形,而不是从原始位图复制和缩放。矩阵将允许您在一个对象中执行与平移(平移)、缩放、倾斜和旋转相关的所有数学运算。每个操作也是可选的。这些操作是根据位图的原点计算的。与此一起使用的api是。这使您能够最大限度地控制位图的变换,但要充分利用这一点,您需要了解一些线性代数


第二个选择是在一开始使用一个,我相信它更容易可视化和使用。使用位图上的源矩形,可以将其可视化为一个窗口,可以在位图的尺寸上滑动,也可以根据需要展开和收缩。目标矩形将表示您希望在屏幕上看到的尺寸。通常情况下,表面的尺寸会查看背景。使用API。

非常好,谢谢你,我现在的速度是50-55 fps,这是可以接受的。我知道我不应该使用createBitmap,因为它很昂贵,但我错误地认为我别无选择。我假设drawBitmap和createBitmap在引擎盖下做了相同的事情。显然不是。我以前用过矩阵,正如你所说,当你需要更多的矩形时,使用它是有意义的。我想我会用它来改变汽车精灵的转向,甚至可能是跳跃缩放。一旦我弄明白了这个基本的引擎,我可能会尝试一个角度的地图,以提供2.5d的效果,当汽车在倾斜的地图后面时,它会变得更小。