2013-01-15 22 views
3

我正在製作一個有很多像素藝術的遊戲。我的遊戲中的標準按鈕大約是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); 
       } 
      } 
     } 
    } 
} 

那麼,我怎麼能讓這個類更快,或者有沒有一種完全不同的方式來正確地做到這一點?

+0

您是否使用''Canvas''在屏幕上繪製這些位圖?如果是,請考慮在運行時嘗試使用''Canvas.drawBitmap(Bitmap,null,dstRect,Paint)''來升級較小的位圖。我很確定有一個標誌可以在「Paint」中使最近鄰居縮放,如果這不是默認的話。 – harism

+0

感謝您的提示,我會盡快嘗試。 – Finnboy11

+0

似乎很好!如果你願意,你可以添加它作爲解決方案,我會接受它。 – Finnboy11

回答

2

而不是創建一個新的更大尺寸的位圖,您還可以使用較小尺寸的位圖直接繪製新的尺寸;

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

這個方法應該重新大小的原始位爲dstRect的大小,我敢肯定有選擇最近的鄰居過濾的設置。這應該使您能夠將較小的圖像直接繪製成所需的大小,同時保留像素藝術外觀。

+1

paint.setAntiAlias(false);和pixelPaint.setFilterBitmap(false);爲我工作。再次感謝! – Finnboy11

相關問題