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