gpt4 book ai didi

android - 在 CustomView 中连续绘制时性能不佳

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:25:59 25 4
gpt4 key购买 nike

用例:

我需要在我的 View 上绘制一百行和几段文字。我需要提供滚动效果,为此我捕获了 ACTION_MOVE 事件并使用更新的点重新绘制所有线条。为了得到想要的结果,我尝试了不同的方法,但都没有达到预期的效果。

方法一

我创建了一个扩展View 的自定义类。所有的绘图和计算都是直接在我的 onDraw() 方法中完成的。由于在onDraw() 方法中完成了太多的操作,应用程序的性能很差。我什至使用 Profile GPU rendering 检查了性能,我可以看到线条非常高。

方法二

我创建了一个位图,并在另一个线程中将所有线条绘制到我的位图上之后,我使用 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 并在另一个线程中对 Canvas 对象执行所有操作。但由于 SurfaceView 使用 CPU 进行绘图操作,因此在低配置手机上性能会很差。

谁能指导我如何以更好的性能完成这项任务?

最佳答案

可以使用您的方法 1 获得良好的性能。

一个听起来很接近您的用例的例子(画线、一些文本和对手势移动进行这些更新)是 MPAndroidChart .这是一个实现高性能的开源库(如果需要统计信息,请参见the following comparison)

要检查的类是 Renderer 类,因为它们包含图表子类型的 onDraw(Canvas c) 中的代码绘制。您可以在此处看到一些用于实现高性能的技巧:

  1. 不要在渲染循环中分配。相反,在循环外分配并重用/回收变量。请参阅 LineChartRenderer line 199
  2. 使用缓冲。例如,在 MPAndroidChart 中,条形图中条形的四个角的点被缓冲,并且重复使用缓冲数组。查看BarBuffer类。
  3. 使用 native Canvas绘图函数(drawPathdrawLine 等)

可以在 Android 性能 Slow Rendering Guide 中找到优化渲染技巧的完整列表。

关于android - 在 CustomView 中连续绘制时性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40741468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com