Как предварительно отрендерить тайловую карту, чтобы перерисовать ее позже?

Я программирую приложение для Android. Я использую Canvas и рисую на нем Tilemap, используя циклы for и рисуя каждую плитку одну за другой.

Я хочу повысить производительность путем рендеринга этой карты тайлов (отдельно переднего плана и фона) один раз и сохранить ее, чтобы я мог рисовать всю эту карту, не зацикливая каждую плитку.

Мой класс графики выглядит так:

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);
            }
        }
    }
    ...
}

Теперь я ищу способ сохранить холст и перерисовывать его каждый игровой цикл в разных позициях, чтобы повысить производительность.

Любые идеи или лучшие практики? Если вам нужна дополнительная информация, пожалуйста, спросите!

Спасибо


person Headless    schedule 24.01.2014    source источник


Ответы (1)


Создайте растровое изображение (одно или столько, сколько вам нужно), используя Bitmap.createBitmap Создайте холст на этом растровом изображении, используя Canvas canvas = new Canvas(bitmap) Нарисуйте на холсте

в onDraw нарисуйте готовые растровые изображения на выходном холсте, используя canvas.drawBitmap

person yoah    schedule 24.01.2014
comment
К сожалению сейчас у меня проблемы с памятью. Я попробую с меньшими тайлами, чтобы общий размер изображения был меньше. Затем я могу растянуть его, чтобы он вписался в мой холст. (Я использовал 128x128px на плитку и получил размер карты около 120x70 плиток). - person Headless; 24.01.2014
comment
Это ожидаемо. Вы ограничены в растровой памяти в 2-3 раза больше, чем количество пикселей на экране - person yoah; 24.01.2014