【问题标题】:Android drawBitmap 5x performance differenceAndroid drawBitmap 5 倍性能差异
【发布时间】:2012-10-26 12:55:43
【问题描述】:

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

第一个示例加载到可绘制位图中并创建它的可变副本

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

【问题讨论】:

    标签: android graphics


    【解决方案1】:

    检查位图的格式。在旧版本的 Android 中,存在一个错误(功能?),在使用某些函数创建位图时,对于没有 alpha 的位图总是使用 565,而对于有 alpha 的位图总是使用 8888。

    我想说的是,不知何故,一个版本使用 8888,而另一个版本使用 565,从而提高了速度。

    使用getConfig 调查这两个位图。

    【讨论】:

    • 问题是,当我调用 cacheBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.RGB_565) 时,我的绘制调用需要 30 毫秒,而当我使用 cacheBitmap = Bitmap.createBitmap(w, h , Bitmap.Config.ARGB_8888) 我的绘图调用需要 40 毫秒,所以不仅如此。
    • @Romain:我知道 :) 我密切关注那个错误。听到你谈论 Android 有点好笑,自从我开始在 Google+ 上关注你后,感觉就像你整天在世界各地旅行和拍照:)
    • @Romain:好的,我在这里有点线程劫持。根据这里的第一条评论,似乎问题不一定是 565/8888。既然您是在 Android 中进行所有渲染的人,您知道这种性能差异来自哪里吗? @seanalltogether:在第一个代码 sn-p 上尝试 getConfig 会得到什么?
    • 听起来很像配置问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多