gpt4 book ai didi

android - 我的滚动位图 Canvas 使用起来太慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:12 31 4
gpt4 key购买 nike

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

作为找出引擎的实验,我创建了一个 2048x1200 位图,我从 PNG 加载它。这将是 map 。然后我创建一个 1024x600 的新位图,从我在屏幕上显示的 map 裁剪。我这样做是因为 getWidth() 和 getHeight() 给出了这些尺寸。我每次都根据在屏幕上显示的运动进行不同的裁剪。

不幸的是,我发现它使用起来太慢了。如果我想让它平稳,汽车就必须以蜗牛的速度移动。我得到大约 18fps。

我正在使用 James Daniello's Simple Game Loop

我还阅读了以下堆栈溢出文章,其中说要尽可能将对象创建置于主循环之外,我正在尽我所能。
How to draw lots of bitmaps on screen in an Android game without slow performance

Romain Guy 的这篇文章也很有用,它使位图保持与屏幕相同的格式,从而避免必须对其进行转换才能显示在屏幕上,这非常昂贵。
Bitmap quality, banding and dithering

在我转向 OpenGL 之前,我想弄清楚我可以使用 Canvas 和 Bitmap 实现的最佳效果。我是在限制中,还是应该做一些不同的事情?我发现每次只将 map 滚动 1 像素以实现平滑滚动时,我得到了 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() 版本。

关于android - 我的滚动位图 Canvas 使用起来太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7733005/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com