只是想知道将位图绘制到画布的最快方法是什么?
目前我有一个位图(和绘图画布),我用它来缓冲绘图调用,然后当我绘制到画布时通过应用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 回答
请参阅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个位图 .
我遇到了和你一样的问题,当你发现一些新的东西时请告诉我 .
这是我到目前为止创立的:
对于Android版本> 3最好不要使用双缓冲区,因为你正在获得硬件加速(需要在清单中设置为true)
设置paint.setDither(true)它会在任何具有不同颜色的设备上更好地工作,然后ARGB_4444,这是大多数设备 . Check this out for more info .
在onSizeChange中你可以根据画布大小调整大小或创建位图,然后框架绘图会快60fps左右,但是在无限循环中使用自定义视图会减慢一些并在某些Android设备上变得跳跃因此我不推荐它 . 相反,最好使用SurfaceView .
检查此示例:How can I use the animation framework inside the canvas?
你需要在某处创建你的位图(例如onCreate或其他地方(构造函数会很好))因为当你做滚动效果时你会反复创建新的位图 . 所以只需要在构造函数中创建而不是使用此位图 .
当我遇到类似的问题时,这对我来说是个很好的解决方案 . 尝试在没有无效的其他地方创建了这个
mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
. 希望它对你有所帮助 .我认为你可以从画布中获得良好的性能..但它需要做很多工作..
如果你从一个性能良好的图形库开始,那么即使你遇到很多错误,你可能仍然会有很好的表现:) lol
有最快的绘图库竞争... libgdx目前正在赢得...
http://code.google.com/p/libgdx/wiki/SimpleApp#Project_Setup