首页 文章

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

提问于
浏览
13

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

目前我有一个位图(和绘图画布),我用它来缓冲绘图调用,然后当我绘制到画布时通过应用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 回答

  • 1

    请参阅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_8888Config并禁用抖动 .

    • 如果可能,删除窗口background .

    • 启用硬件加速,但要注意unsupported operations .

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

  • 2

    我遇到了和你一样的问题,当你发现一些新的东西时请告诉我 .

    这是我到目前为止创立的:

    • 对于Android版本> 3最好不要使用双缓冲区,因为你正在获得硬件加速(需要在清单中设置为true)

    • 设置paint.setDither(true)它会在任何具有不同颜色的设备上更好地工作,然后ARGB_4444,这是大多数设备 . Check this out for more info .

  • 0

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

    检查此示例:How can I use the animation framework inside the canvas?

  • 6

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

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

  • 0

    我认为你可以从画布中获得良好的性能..但它需要做很多工作..

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

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

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

相关问题