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

Nic*_* A. 17 performance android drawing rendering opengl-es

背景

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

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

问题

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

解决方案

View.onDraw():

优点

  • 一些易于实现的东西

缺点

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

位图:

优点

  • 真的很容易实现
  • 很好的表现;很好的绩效

缺点

  • 必须使用丑陋的缩放

OpenGL的:

优点

  • 可能性能很好,取决于我的实现

缺点

  • 更多工作要实施

最后的话

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

有一点在OpenGL中更容易实现平移/缩放,因为我可以操纵矩阵来使其正确,其余的应该更难,尽管我认为.

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

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


补充说明:

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

Rom*_*Guy 16

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

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

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

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

  • 这真的取决于你使用Canvas做什么以及你对OpenGL的了解程度.它可以从简单(绘制位图)到复杂(任意抗锯齿路径). (2认同)