【发布时间】:2017-04-06 02:31:35
【问题描述】:
用例:
我需要在我的视图上画一百行和几段文字。我需要提供滚动效果,为此我捕获ACTION_MOVE 事件并用更新的点重新绘制所有线条。为了得到想要的结果,我尝试了不同的方法,但没有一个按预期工作。
方法 1
我创建了一个扩展 View 的自定义类。所有的绘图和计算都直接在我的onDraw() 方法中完成。由于在onDraw() 方法中完成了很多操作,因此应用程序的性能很差。我什至使用 Profile GPU 渲染 检查了性能,我可以看到线条非常高。
方法 2
我创建了一个位图,在另一个线程中将所有线条绘制到我的位图上后,我使用postInvalidate() 在onDraw() 方法中绘制位图:
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。我自己没有使用过该框架,但这似乎是一个很好的用例。 -
我的用例不需要 RenderScript。
-
不要在
onDraw()分配新的位图,这就是你有fps下降的原因。 -
不要使用位图操作,如果只有线条,您可以使用视图本身来实现。
标签: android performance canvas surfaceview android-bitmap