たくさんのピクセルアートが入ったゲームを作っています。私のゲームの標準ボタンは約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);
}
}
}
}
}
では、どうすればこのクラスを高速化できますか、それともこれを正しく行うためのまったく異なる方法がありますか?