2013-01-15 3 views
3

저는 픽셀 아트가 많은 게임을 만들고 있습니다. 내 게임의 표준 버튼은 약 12x12 픽셀이며 표시를 위해 5 배 확대되었습니다. 모든 문자는 화면에 따라 두 배 더 커집니다. 문제는 내가 이러한 모든 이미지를 업 스케일 된 비트 맵에 저장하면 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.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