Android,绘制位图到画布的最快方法

时间:2011-07-28 09:09:13

标签: android graphics canvas bitmap

想知道将位图绘制到画布的最快方法是什么?

目前我有一个位图(和绘图画布),我用它来双重缓冲绘图调用,然后当我绘制到画布时通过应用1px画布翻译具有滚动效果。仅此一项就可以将帧速率从60+ FPS降低到~40,非常受欢迎。我现在不使用surfaceView(或GLSurfaceView),但只是想知道我是否遗漏任何会提高速度的东西。下面的onDraw()代码

@Override
    public void onDraw(Canvas canvas)
    {
        //update fps text
        mFpsTracker.frameTouch();

        if(mBufferedBitmap == null)
        {
            mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
            mBufferedCanvas = new Canvas(mBufferedBitmap);
        }

        paint.setColor(Color.BLUE);
        mBufferedCanvas.drawLine(0, getHeight(), getWidth(), getHeight(), paint);
        mBufferedCanvas.translate(0, -1);


    canvas.drawBitmap(mBufferedBitmap, 0, 0, null); 

    //draw fps
    mTextPaint.setColor(Color.WHITE);
    canvas.drawText(mFpsTracker.getFPSString(), 40, 40, mTextPaint);


    invalidate();       
}

5 个答案:

答案 0 :(得分:6)

请参阅Romain Guy撰写的this博文。

视频版本可用here

不要再使用ARGB_4444了。它已被弃用。每个像素仅为每个通道分配4位(因此名称)。 ARBG_8888提供16,777,216种颜色而不是ARBG_4444的4,096种颜色,但每像素使用4个字节而不是2个。

在Gingerbread中,Android将ARGB_8888作为Surface的标准格式,并因此增加了每个进程的内存分配。

Window's和(假设您使用简化的SurfaceView)SurfaceHolder格式设置为RGBA_8888效率更高。这样可以避免格式变化明显变慢。

其他提示包括:

  • 限制alpha合成,因为这需要来自Skia的相对昂贵的混合。
  • 请求位图Options,它更喜欢ARGB_8888 Config并禁用抖动。
  • 如果可能,请删除窗口background
  • 启用硬件加速,但要注意unsupported operations

在2.1设备上,我能够以50 fps的速度在屏幕上绘制至少300个位图。

答案 1 :(得分:2)

我和你的问题一样,当你发现一些新事物时请告诉我。

这是我迄今为止所创立的:

  1. 对于Android版> 3最好不要使用双缓冲区,因为你正在获得硬件加速(需要在清单中设置为true)
  2. 设置paint.setDither(true)它可以在任何颜色不同的设备上工作,然后是ARGB_4444,这是大多数设备。 Check this out for more info

答案 2 :(得分:1)

在onSizeChange中你可以根据画布大小调整大小或创建位图,然后框架绘图将大约快60fps,但是在无限循环中使用自定义视图会减慢一些并在某些Android设备上变得跳跃因此我做不推荐它。相反,最好使用SurfaceView。

选中此示例:How can I use the animation framework inside the canvas?

答案 3 :(得分:0)

你需要在某处创建你的位图(例如onCreate或其他地方(构造函数会很好))因为当你做滚动效果时你会一次又一次地创建新的位图。所以只需要在构造函数中创建而不是使用此位图。

当我遇到类似问题时,这对我来说是个很好的解决方案。 尝试在没有无效的其他地方创建此mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);。 希望它对你有帮助。

答案 4 :(得分:0)

我认为你可以从画布中获得良好的表现......但这需要很多工作......

如果你从一个性能良好的图形库开始,那么即使你遇到了很多错误,你可能仍会以良好的性能结束:) lol

最快的绘图库正在竞争... libgdx目前正在赢得...

http://code.google.com/p/libgdx/wiki/SimpleApp#Project_Setup