2011-10-11 50 views
4

我正在学习为Android编程。我做了几个基本的游戏,但为了学习,我想制作一款汽车驾驶游戏。我认为这样做最简单的方法是将汽车保持在屏幕中间,并滚动背景以给出移动幻觉。我的滚动位图画布太慢,无法使用

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

不幸的是我觉得这个速度太慢,无法使用。如果我想要平稳的话,汽车将不得不以蜗牛的速度移动。我得到约18fps。

我使用James Daniello's Simple Game Loop

我也看了下面的栈溢出的文章,其称,以保持对象创建了主循环的尽可能多的,这我尽我所能做的事情。
How to draw lots of bitmaps on screen in an Android game without slow performance

也使用的是这篇文章罗曼盖伊上保持位图的格式相同屏幕来阻止它有要转化的画面,这是非常昂贵的上显示。
Bitmap quality, banding and dithering

我想在使用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; 
    } 
} 

回答

5

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

+0

非常感谢你,我现在高达50-55 fps这是更可以接受的。我知道我不应该使用createBitmap,因为它是昂贵的,但我错误地认为我没有选择。我认为drawBitmap和createBitmap在底层做了同样的事情。显然不是。 – pholcroft

0

您可以使用以下两种策略之一来复制和缩放原始位图:矩阵或剪裁矩形。矩阵将允许您执行所有与平移(平移),缩放,倾斜和旋转相关的数学运算到一个对象中。每个操作也是可选的。这些操作是根据位图的原点进行计算的。使用这个API是Canvas.drawBitmap (Bitmap bitmap, Matrix matrix, Paint paint)。这使您可以最大限度地控制位图转换,但要充分利用这一点,您需要了解一些线性代数。

第二个选择是使用rectangle,我相信它在开始的时候更易于可视化和使用。在位图上使用源矩形可以将其视为一个可以滑过位图尺寸的窗口,也可以根据需要进行扩展和收缩。目标矩形将表示您希望在屏幕上看到的尺寸。通常SurfaceView的背景尺寸。使用它的Canvas.drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint) API。

+0

我之前使用过这个矩阵,并且我认为如果您需要更多矩形,那么使用它就很有意义。我想我会用它来改变汽车转弯的精灵,甚至可能为了跳跃而缩放。一旦我找到了这个基本的引擎,我可能会尝试一个角度的地图,以便在倾斜地图背面的汽车变小时提供2.5d的效果。 – pholcroft