Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:Canvas vs OpenGL_Android_Opengl Es_Canvas - Fatal编程技术网

Android:Canvas vs OpenGL

Android:Canvas vs OpenGL,android,opengl-es,canvas,Android,Opengl Es,Canvas,我有一个绘图应用程序,用户可以用手指画线,调整颜色、厚度等。在用户绘图时,我将聚集的X/Y点从MotionEvent转换为,并创建Android路径,然后通过画布将其绘制到屏幕上,并将SVG路径提交到应用程序的数据库中 我遵循中使用的模型,通过重复调用invalidate()(因此,onDraw())动态绘制“进行中”的行,一旦行完成并启动新行,则在基础画布的onDraw()位图中绘制上一行,使用进行中的线再次生成重复的重新绘制 这在该应用程序中工作正常-直到您开始旋转基础位图以补偿设备旋转,支

我有一个绘图应用程序,用户可以用手指画线,调整颜色、厚度等。在用户绘图时,我将聚集的X/Y点从
MotionEvent
转换为,并创建Android路径,然后通过画布将其绘制到屏幕上,并将SVG路径提交到应用程序的数据库中

我遵循中使用的模型,通过重复调用
invalidate()
(因此,
onDraw()
)动态绘制“进行中”的行,一旦行完成并启动新行,则在基础
画布的
onDraw()
位图中绘制上一行,使用进行中的线再次生成重复的重新绘制

这在该应用程序中工作正常-直到您开始旋转基础
位图以补偿设备旋转,支持在绘图表面上“放大”的功能,因此必须缩放基础
位图
,等等。例如,随着设备旋转和绘图缩放,当用户绘图时,我们需要在onDraw()中缩放和旋转位图,这绝对是爬行

我已经看过一个
SurfaceView
,但由于它仍然使用相同的
Canvas
机制,我不确定我是否会看到明显的改进。。。所以我的想法转向OpenGL。我曾在某个地方读到OpenGL可以“免费”进行旋转和缩放,甚至看到(第三条评论)在未来的版本中,
Canvas
可能会消失

本质上,我有点被困在
画布
和OpenGL解决方案之间。。。我有一个2D绘图应用程序,当处于一种状态时,它似乎非常适合
画布
模型,因为没有像游戏一样不断地重新绘制(例如,当用户不绘制时,我不需要任何重新绘制),但是当用户正在绘制时,我需要最大的性能来做一些越来越复杂的事情与表面


欢迎您提供任何想法、建议和建议。

您是对的,SurfaceView在引擎盖下面使用画布。主要区别在于SurfaceView使用另一个线程进行实际绘制,这通常会提高性能。不过,这听起来对你帮助不大


OpenGL可以非常快速地进行旋转,这是正确的,因此,如果您需要更高的性能,这是最好的选择。您可能应该使用GLSurfaceView。使用OpenGL的主要缺点是,编写文本非常困难。基本上,您必须(好的,不必,但似乎是最好的选择)渲染文本位图。

OpenGL将能够轻松处理旋转和缩放

老实说,要做到这一点,您可能需要学习很多OpenGL,特别是与以下主题相关的内容:

  • 几何学
  • 照明(或仅禁用)
  • 拾取(选择要在其上绘制的几何图形)
  • 像素贴图
  • 纹理映射
  • Mipmapping
另外,学习OpenGL可能会有点过火,你必须非常擅长它才能使它更高效

相反,我建议使用基于openGL构建的游戏库的图形组件,例如:


    • 这个问题是6年前提出的。也许安卓4.0还没有出现? 实际上,在Android 4.0之后,Android.view.view的画布是一个硬件加速画布,这意味着它是由OpenGL实现的,因此不需要使用其他方法来提高性能


      您可以看到将视图中普通画布的性能与GLSURFACHEVIEW进行比较的示例

      幸运的是,我不会做任何文本,只是Android路径,所以文本问题可能不会出现。