【问题标题】:How to pre-render a tile map for redrawing it later?如何预渲染瓦片地图以便稍后重绘?
【发布时间】:2014-01-24 10:03:46
【问题描述】:

我正在编写一个 Android 应用程序。我正在使用 Canvas,并通过使用 for 循环在其上绘制 Tilemap,并一个接一个地绘制每个图块。

我想通过渲染这个 tilemap(前景和背景个体)一次并保存它来提高性能,这样我就可以绘制整个地图而无需循环抛出每个瓦片。

我的图形类如下所示:

public class AGraphics implements Graphics {
    Bitmap frameBuffer;
    Canvas canvas;
    Paint paint;
    ...

    public AGraphics(.., Bitmap frameBuffer) {
        this.frameBuffer = frameBuffer;
        this.canvas = new Canvas(frameBuffer);
        this.paint = new Paint();

    }

    ...
    public void drawPixmap(...){
        canvas.drawBitmap(((AndroidPixmap) pixmap).bitmap, ... );
    }

    ...

}

My World Class 调用 draw Pixmap 函数来绘制每个图块:

public class World {
    ...
    public void drawForeground (float posX, float posY){
        // get Graphics ...
        for (int y = 0; y < map.height; y++) {
            for (int x = 0; x <map.width; x ++) {
                // calculate Positions
                g.draw(tileset, (int)posX, (int)posY, srcX, srcY, tilesize, tilesize);
            }
        }
    }
    ...
}

现在我正在寻找一种方法来保存画布并在每个 GameLoop 的不同位置重新绘制它以提高性能。

有什么想法或最佳实践吗?如果您需要更多信息,请询问!

谢谢

【问题讨论】:

    标签: java android buffer android-canvas tile


    【解决方案1】:

    使用Bitmap.createBitmap 创建位图(一个或多个) 使用Canvas canvas = new Canvas(bitmap) 在该位图上创建画布 绘制到画布中

    onDraw 中,使用canvas.drawBitmap 将准备好的位图绘制到输出画布中

    【讨论】:

    • 不幸的是,现在我的内存出现了问题。我将尝试使用较小的图块,以使总图像尺寸更小。然后我可以拉伸它,让它适合我的画布。 (我每个 Tile 使用 128x128px,得到的地图大小约为 120x70 tile)。
    • 这是意料之中的。您的位图内存限制为屏幕上像素数量的 2-3 倍
    猜你喜欢
    • 2014-03-17
    • 2020-04-23
    • 2012-02-02
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多