关于Android中高性能绘图的提示

时间:2011-07-30 06:54:26

标签: android performance opengl-es drawing rendering

背景

我正在为一个Android应用程序编写一个图形库(是的,我知道有很多,但没有提供我们需要的可定制性。)

我希望图表可以缩放和平移。

问题

我希望体验顺畅,留下小巧的CPU占用空间。

解决方案

View.onDraw():

优势

  • 一些易于实施的内容

缺点

  • 表现不佳? (除非它使用OpenGL,是吗?)

位图:

优势

  • 非常容易实施
  • 出色的表现

缺点

  • 必须使用丑陋的缩放

的OpenGL:

优势

  • 根据我的实施情况,可能会有出色的表现

缺点

  • 更多工作要实施

最后的话

OpenGL可能是专业的解决方案,肯定会提供更多的灵活性,但需要更多的工作(目前还不清楚)。

在OpenGL中,一件事情肯定更容易是平移/缩放,因为我可以操纵矩阵来使其正确,但我想其余的应该更难。

我不害怕弄脏手,但在开始挖掘之前我想知道我正朝着正确的方向前进。

我错过了任何解决方案吗?我所有的解决方案都是理智的吗?


附加说明:

我可以补充一点,当图表发生变化时,我希望对变化进行动画处理,这可能是所有人中最苛刻的任务。

1 个答案:

答案 0 :(得分:16)

使用Views的问题在于您继承了UI工具包本身的开销。虽然工具包经过了很好的优化,但它的功能并不一定是你想要的。想要控制绘图时最大的缺点是无效/绘制循环。

您可以使用SurfaceView解决此“问题”。 SurfaceView允许您使用自己的渲染线程渲染到窗口,从而绕过UI工具包的开销。您仍然可以使用Canvas 2D渲染API。

然而,

Canvas正在使用软件渲染管道。您的性能主要取决于CPU的速度和可用带宽。在实践中,它很少像OpenGL一样快。 Android 3.0为Canvas提供了一个新的硬件管道,但仅限于通过Views渲染时。您目前无法使用硬件管道直接渲染到SurfaceView上。

我建议您首先尝试使用SurfaceView。如果您正确编写代码(不要绘制超过您需要的代码,只重绘已更改的内容等),您应该能够实现所寻求的性能。如果这不起作用,请使用OpenGL。