我正在製作一個有很多像素藝術的遊戲。我的遊戲中的標準按鈕大約是12x12像素,並放大了五倍以供顯示。所有的角色也會縮放兩倍,具體取決於屏幕。問題是,如果我將所有這些圖像存儲到放大的位圖中,我會在Android中發現內存不足錯誤。如果我每次都試圖擴展繪圖,遊戲的運行速度非常緩慢。如何在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);
}
}
}
}
}
那麼,我怎麼能讓這個類更快,或者有沒有一種完全不同的方式來正確地做到這一點?
您是否使用''Canvas''在屏幕上繪製這些位圖?如果是,請考慮在運行時嘗試使用''Canvas.drawBitmap(Bitmap,null,dstRect,Paint)''來升級較小的位圖。我很確定有一個標誌可以在「Paint」中使最近鄰居縮放,如果這不是默認的話。 – harism
感謝您的提示,我會盡快嘗試。 – Finnboy11
似乎很好!如果你願意,你可以添加它作爲解決方案,我會接受它。 – Finnboy11