想知道将位图绘制到画布的最快方法是什么?
目前我有一个位图(和绘图画布),我用它来双重缓冲绘图调用,然后当我绘制到画布时通过应用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();
}
答案 0 :(得分:6)
请参阅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效率更高。这样可以避免格式变化明显变慢。
其他提示包括:
在2.1设备上,我能够以50 fps的速度在屏幕上绘制至少300个位图。
答案 1 :(得分:2)
我和你的问题一样,当你发现一些新事物时请告诉我。
这是我迄今为止所创立的:
答案 2 :(得分:1)
在onSizeChange中你可以根据画布大小调整大小或创建位图,然后框架绘图将大约快60fps,但是在无限循环中使用自定义视图会减慢一些并在某些Android设备上变得跳跃因此我做不推荐它。相反,最好使用SurfaceView。
选中此示例:How can I use the animation framework inside the canvas?
答案 3 :(得分:0)
你需要在某处创建你的位图(例如onCreate或其他地方(构造函数会很好))因为当你做滚动效果时你会一次又一次地创建新的位图。所以只需要在构造函数中创建而不是使用此位图。
当我遇到类似问题时,这对我来说是个很好的解决方案。 尝试在没有无效的其他地方创建此mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_4444);
。
希望它对你有帮助。
答案 4 :(得分:0)
我认为你可以从画布中获得良好的表现......但这需要很多工作......
如果你从一个性能良好的图形库开始,那么即使你遇到了很多错误,你可能仍会以良好的性能结束:) lol
最快的绘图库正在竞争... libgdx目前正在赢得...
http://code.google.com/p/libgdx/wiki/SimpleApp#Project_Setup