Android,将位图绘制到 Canvas 的最快方法

标签 android graphics canvas bitmap

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

目前我有一个位图(和用于绘图的 Canvas ),用于双缓冲绘图调用,然后当我绘制到 Canvas 时,通过应用 1px Canvas 转换产生滚动效果。仅此一项就会将帧率从 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();       
}

最佳答案

请参阅this Romain Guy 的博文。

视频版本可用here .

不要再使用 ARGB_4444。它已被弃用。每个像素每个 channel 仅分配 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 个位图。

关于Android,将位图绘制到 Canvas 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6856550/

相关文章:

javascript - HTML 5 Canvas 中的一手拉圆模拟

android - libgdx 纹理图像透明渲染

android - 如何在 Android 的单个响应中解析 XML 和 JSON 数据

c++ - 如何使用另一个转换来反转(或取消)OpenGL SRT 转换?

c# - 使用 WinForms 绘制宽线时出现 OutOfMemoryException

javascript - 在 JavaScript 中拉伸(stretch)图形以填充 Canvas 元素

css - 在 html Canvas 圆圈中有多个可点击的部分,在每个被点击的区域填充颜色

android - 当测试按下开始按钮时游戏没有开始

Android ViewPager 未更新

java - 在透明 JPanel 上绘画时留下痕迹