只是想知道将位图绘制到 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/