安卓:Canvas与OpenGL的区别

18
我有一个绘图应用程序,用户可以用手指画线,并调整颜色、粗细等。当用户绘制时,我将MotionEvent中的X/Y点转换为SVG路径,同时创建Android Path,然后通过Canvas将Android Path绘制到屏幕上,并将SVG Path提交到应用程序的数据库中。
我遵循了FingerPaint中使用的模型,在其中“正在进行”的线条通过重复调用invalidate()(因此,onDraw())实时绘制,一旦线条完成并开始新的线条,以前的线条将从底层的Canvas Bitmap中在onDraw()中绘制,而正在进行的线条再次生成重复的重新绘制。
这在这个应用程序中很好地工作 - 直到您开始旋转底层的Bitmap以补偿设备旋转,支持“缩放”绘图表面的能力,因此必须缩放底层的Bitmap等。例如,当设备旋转并且绘图缩放时,当用户绘制时,我们需要在onDraw()中缩放和旋转我们的Bitmap,并且这是非常慢的。
我看了一下SurfaceView,但由于它仍然使用相同的Canvas机制,我不确定是否会看到明显的改进...所以我的想法转向OpenGL。我曾经在某个地方读到过,OpenGL可以免费进行旋转和缩放,甚至看到了Canvas可能在未来版本中消失的传言(第三条评论)。
基本上,我有点陷入了Canvas和OpenGL解决方案之间...我有一个2D绘图应用程序,在一个状态下似乎完美地适合Canvas模型,因为没有像游戏那样不断重新绘制(例如,当用户不绘制时,我不需要任何重新绘制),但当用户正在绘制时,我需要尽可能高的性能来对表面进行一些越来越复杂的操作...
欢迎任何想法、指针和建议。
3个回答

6

OpenGL可以轻松处理旋转和缩放。

老实说,要做到这一点,你可能需要学习很多与以下主题相关的OpenGL知识:

  • 几何
  • 光照(或仅禁用光照)
  • 拾取(选择要绘制的几何图形)
  • 像素映射
  • 纹理映射
  • Mipmapping

此外,为此学习OpenGL可能有些过度,而且你必须非常擅长才能使其高效。

相反,我建议使用构建在OpenGL之上的游戏库的图形组件,例如:


4

嗯,这个问题是6年前提出的。也许Android 4.0还没有推出?

实际上,在Android 4.0之后,位于android.view.View的Canvas是一个硬件加速画布,这意味着它是由OpenGL实现的,因此您不需要使用其他方式来提高性能。

您可以查看https://github.com/ChillingVan/android-openGL-canvas/blob/master/canvasglsample/src/main/java/com/chillingvan/canvasglsample/comparePerformance/ComparePerformanceActivity.java,以比较视图中正常画布与GLSurfaceView的性能。


2

你说得对,SurfaceView在底层使用画布(Canvas)。主要区别在于SurfaceView使用另一个线程进行实际绘制,这通常会提高性能。尽管如此,它似乎并不能为你带来太大的帮助。

你正确地指出OpenGL可以快速完成旋转,因此如果您需要更高的性能,那么这是正确的选择。您应该使用GLSurfaceView。使用OpenGL的主要缺点是渲染文本真的很麻烦。基本上,您必须(好吧,不一定非得这样,但似乎是最佳选项)渲染文本位图。


幸运的是,我不需要处理任何文本,只需要处理Android路径,因此文本问题可能不会出现。 - Unpossible

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接