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

Dor*_*ori 13 graphics android 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();       
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ark 6

请参阅Romain Guy撰写的这篇博客文章.

此处提供视频版本.

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

在姜饼,机器人作出ARGB_8888为标准格式表面和每因为它处理增加的存储器分配.

Window的设置和(假设您使用流线型SurfaceView)SurfaceHolder的格式设置为RGBA_8888更有效.这样可以避免格式变化明显变慢.

其他提示包括:

  • 限制alpha合成,因为这需要来自Skia的相对昂贵的混合.
  • 请求位图选项更喜欢ARGB_8888 配置并禁用抖动.
  • 如果可能,删除窗口背景.
  • 启用硬件加速,但要注意不受支持的操作.

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


Pet*_*ter 0

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

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