如何在Android中有效地绘制放大的像素艺术?

时间:2013-01-15 10:34:44

标签: android bitmap pixel memory-efficient

我正在制作一款拥有大量像素艺术的游戏。我的游戏中的标准按钮大约是12x12像素,并且按比例缩放了五次以进行显示。根据屏幕的不同,所有角色的缩放比例都要大两倍。问题是,如果我将所有这些图像存储到放大的位图,我会在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);
                }
            }
        }
    }
}

那么,我怎样才能更快地完成这个课程,或者是否有完全不同的方法来正确地完成这个课程?

1 个答案:

答案 0 :(得分:2)

您可以使用以下方法直接将较小尺寸的Bitmap绘制为新尺寸,而不是创建新的更大尺寸的Bitmap;

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

此方法应将原始位图的大小重新调整为dstRect大小,我非常确定有一个选择最近邻居过滤的设置。这样您就可以将较小的图像直接绘制成所需的尺寸,同时保留像素艺术效果。