Android drawBitmap 5x性能差异

时间:2011-08-09 00:38:16

标签: android graphics

我整晚都在与安卓性能进行斗争并且可能解决了我一直在处理的问题,但是我仍然非常困惑并且可以使用一些帮助。考虑这两个样本之间的时间差异。

第一个样本加载在一个可绘制的位图中并创建一个可变的副本

Bitmap cacheBitmap;
Canvas cacheCanvas;
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    if (cacheBitmap != null) {
        cacheBitmap.recycle();
    }
    Resources res = getContext().getResources();
    Bitmap blankImage = BitmapFactory.decodeResource(res, R.drawable.blank);

    /* copy existing bitmap */
    cacheBitmap = Bitmap.createScaledBitmap(blankImage, w, h, false);
    /* copy existing bitmap */

    cacheCanvas = new Canvas();
    cacheCanvas.setBitmap(cacheBitmap);
    cacheCanvas.drawRGB(255, 255, 255);
}
public void onDraw(Canvas canvas) {
    canvas.drawBitmap(cacheBitmap, 0, 0, null); // draws in 7-8 ms
}

第二个示例创建一个新的位图而不复制原始空白图像。

Bitmap cacheBitmap;
Canvas cacheCanvas;
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    if (cacheBitmap != null) {
        cacheBitmap.recycle();
    }
    Resources res = getContext().getResources();
    Bitmap blankImage = BitmapFactory.decodeResource(res, R.drawable.blank);

    /* create fresh bitmap */
    cacheBitmap = Bitmap.createBitmap(w, h, blankImage.getConfig());
    /* create fresh bitmap */

    cacheCanvas = new Canvas();
    cacheCanvas.setBitmap(cacheBitmap);
    cacheCanvas.drawRGB(255, 255, 255);
}
public void onDraw(Canvas canvas) {
    canvas.drawBitmap(cacheBitmap, 0, 0, null); // draws in 40 ms
}

第一个样本比第二个样本快5-6倍,为什么会这样?我希望能够以某种方式编写此代码,甚至不依赖于空白图像,但无论我做什么,我最终都会得到一个缓慢的位图绘制,而不是最初可以复制。

2 个答案:

答案 0 :(得分:3)

检查位图的格式。在早期版本的Android中,有一个错误(功能?)在使用某些功能创建位图时,总是使用565表示没有alpha的位图,8888表示使用alpha的位图。

我很想说某种版本使用8888,而另一种版本使用565,这样可以获得速度增益。

使用getConfig调查两个位图。

答案 1 :(得分:1)

无法createScaledBitmap()实际创建一个新的位图,其中包含屏幕所需的比例,在内部提供1:1的像素绘制,可能允许更快的绘图程序,其中第二个只是创建一个新的位图,其中包含原始资源的所有信息(可能是很多额外的像素),每次调用绘制位图都会导致内部位图中的像素和正在绘制的画布之间的内部缩放到?