用例:
我需要在视图上绘制数百条线和一些文本。我需要实现滚动效果,为此捕获 ACTION_MOVE
事件并重新绘制所有带有更新点的线条。为了达到预期的结果,我尝试了不同的方法,但都没有奏效。
方法1:
我创建了一个自定义类,它扩展了 View
。 所有的绘制和计算都直接在我的 onDraw()
方法中完成。由于 onDraw()
方法中有很多的操作,因此应用程序的性能非常差。我甚至使用 Profile GPU rendering 检查了性能,可以看到线条非常高。
方法2:
我创建了一个位图,并在另一个线程中将所有的线条绘制到我的位图上,在 onDraw()
方法中使用 postInvalidate()
绘制位图:
mBufferedBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mBufferedBitmap.eraseColor(Color.TRANSPARENT);
Canvas mBufferedCanvas = new Canvas(mBufferedBitmap);
drawLines(mBufferedCanvas)
postInvalidate();
由于我在位图上擦除了所有之前的绘图并使用更新后的点绘制新的线条,因此屏幕会出现闪烁。
方法3
我尝试将自定义类扩展到SurfaceView
并在另一个线程中执行所有画布对象的操作。但是由于SurfaceView
使用CPU进行绘图操作,在低配置的手机中性能将不佳。
有人可以指导我如何实现更好的性能来完成这个任务吗?
RenderScript
。我自己没有使用过这个框架,但这似乎是一个很好的使用案例。 - BryanonDraw()
中分配新的位图,这就是你的fps下降的原因。 - Nikola Despotoski