2011-08-09 37 views
10

我一直在与android的性能战斗整夜,可能解决了我一直在处理的问题,但我仍然很困惑,可以使用一些帮助。考虑这两个样本之间的时间差异。安卓drawBitmap 5倍的性能差异

在绘制位图的第一个样品负载并为其创建

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倍,这是为什么?我希望能够以某种甚至不依赖空白图像的方式编写此代码,但无论我做什么,最终都会得到一个缓慢的位图绘制,而最初没有它可用于复制。

回答

3

检查位图的格式。在旧版本的Android中,有一个错误(功能?),当使用某些函数创建位图时,始终将565用于不带alpha的位图和8888带alpha的位图。

我很想说,不知何故,一个版本使用8888,而另一个使用565,给你速度增益。使用getConfig调查这两个位图。

+0

的事情是,当我打电话 cacheBitmap = Bitmap.createBitmap(W,H,Bitmap.Config.RGB_565)我绘制调用需要30毫秒,当我使用 cacheBitmap = Bitmap.createBitmap(W,H,位图。 Config.ARGB_8888)我的绘制电话需要40毫秒,所以不只是这样。 – seanalltogether

+7

这是一个功能:) –

+0

@Romain:我知道:)我紧跟着那个bug。有趣的是,听到你谈论Android,自从我开始在Google+上关注你之后,感觉就像你花了整天的时间在世界各地旅行并拍照:) – EboMike

1

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