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)
请参阅Romain Guy撰写的这篇博客文章.
此处提供视频版本.
不要再使用ARGB_4444了.它已被弃用.每个像素仅为每个通道分配4位(因此名称).ARBG_8888提供16,777,216种颜色而不是ARBG_4444的4,096种颜色,但每像素使用4个字节而不是2个字节.
在姜饼,机器人作出ARGB_8888为标准格式表面和每因为它处理增加的存储器分配.
将Window的设置和(假设您使用流线型SurfaceView)SurfaceHolder的格式设置为RGBA_8888更有效.这样可以避免格式变化明显变慢.
其他提示包括:
在2.1设备上,我能够以50 fps的速度在屏幕上绘制至少300个位图.
你需要在某个地方创建你的位图(例如 onCreate 或其他地方(构造函数会很好)),因为当你做滚动效果时,你一次又一次地创建了新的位图。所以只需要在构造函数中创建而不是使用这个位图。
当我遇到类似问题时,这对我来说是一个很好的解决方案。mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);尝试在其他没有 invalidate 的地方创建它。希望对你有帮助。