3

たくさんのピクセルアートが入ったゲームを作っています。私のゲームの標準ボタンは約12x12ピクセルで、表示用に5倍に拡大されています。画面によっては、すべての文字も2倍に拡大縮小されます。問題は、これらすべての画像をアップスケールされたビットマップに保存すると、Androidでメモリ不足エラーが発生することです。描画するたびにスケールアップしようとすると、ゲームの実行が非常に遅くなります。

そのため、私は独自のPixelArtBitmapクラスを作成しました。それは素晴らしい画像をもたらし、メモリをほとんど必要としませんが、非常に非効率的で、私のfpsを大幅に落とします。描画するたびにビットマップをスケールアップするよりも高速です。クラスは次のとおりです。

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

class PixelArtBitmap{
    private int[][] pixels = null;
    private boolean[][] visible = null;

    private float width = 0;
    private float height = 0;

    private float drawWidth = 0;
    private float drawHeight = 0;

    private int pixelsX = 0;
    private int pixelsY = 0;

    private static Paint boxPaint = new Paint();

    public PixelArtBitmap(Bitmap bitmap, float scale){
        boxPaint.setStrokeWidth(0);

        pixels = new int[bitmap.getWidth()][bitmap.getHeight()];
        visible = new boolean[bitmap.getWidth()][bitmap.getHeight()];

        pixelsX = bitmap.getWidth();
        pixelsY = bitmap.getHeight();

        //Utility is an another class of mine, providing information about the device
        drawWidth = scale * Utility.getScaleWidth();
        drawHeight = scale * Utility.getScaleHeight();

        width = pixelsX * drawWidth;
        height = pixelsY * drawHeight;

        for(int x = 0 ; x < bitmap.getWidth() ; x++){
            for(int y = 0 ; y < bitmap.getHeight() ; y++){
                pixels[x][y] = bitmap.getPixel(x,y);

                if(Color.alpha(pixels[x][y]) == 0) visible[x][y] = false;
                else visible[x][y] = true;
            }
        }

        bitmap.recycle();
        bitmap = null;
    }

    public void draw(float x, float y, Canvas canvas){
        for(int drawY = 0 ; drawY < pixelsY ; drawY++){
            for(int drawX = 0 ; drawX < pixelsX ; drawX++){
                if(visible[drawX][drawY]){
                    boxPaint.setColor(pixels[drawX][drawY]);
                    canvas.drawRect(x + drawWidth * drawX, y + drawHeight * drawY,
                            x + drawWidth * (drawX + 1), y + drawHeight * (drawY + 1), boxPaint);
                }
            }
        }
    }
}

では、どうすればこのクラスを高速化できますか、それともこれを正しく行うためのまったく異なる方法がありますか?

4

1 に答える 1

2

新しい大きなサイズのビットマップを作成する代わりに、以下を使用して小さなサイズのビットマップを新しいサイズに直接描画することもできます。

Canvas.drawBitmap(Bitmap, null, dstRect, Paint);

この方法では、元のビットマップのサイズをdstRectサイズに変更する必要があり、最近傍フィルタリングを選択する設定があると確信しています。これにより、ピクセルアートの外観を維持しながら、小さい画像を目的のサイズに直接描画できるようになります。

于 2013-01-15T14:52:01.450 に答える