【问题标题】:Android: Canvas vs OpenGLAndroid:画布与 OpenGL
【发布时间】:2011-06-10 15:26:09
【问题描述】:

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

我遵循FingerPaint 中使用的模型,通过重复调用invalidate()(因此,onDraw())即时绘制“进行中”行,一旦行完成,新行开始,前一行从底层 Canvas BitmaponDraw() 中绘制,正在进行的行再次生成重复重新绘制。

这在此应用程序中运行良好 - 直到您开始旋转底层 Bitmap 以补偿设备旋转,支持在绘图表面上“放大”的能力,因此必须缩放底层 Bitmap 等。所以举个例子,当设备旋转并且绘图被缩放时,当用户在绘图时,我们需要在 onDraw() 中缩放和旋转我们的 Bitmap,这绝对是在爬行。

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

基本上,我在Canvas 和 OpenGL 解决方案之间有点卡住了...我有一个 2D 绘图应用程序,它在一种状态下似乎完全适合 Canvas 模型,因为没有不断的重新绘制像游戏一样进行(例如,当用户不绘图时,我不需要任何重新绘图),但是当用户正在绘图时,我需要在表面上做一些越来越复杂的事情所必需的最大性能......

欢迎任何想法、指点和建议。

【问题讨论】:

    标签: android opengl-es canvas


    【解决方案1】:

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

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

    • 几何
    • 照明(或只是禁用它)
    • 拾取(选择要在其上绘制的几何图形)
    • 像素图
    • 纹理映射
    • 微映射

    此外,为此学习 OpenGL 可能有点过头了,您必须精通它才能使其高效。

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

    【讨论】:

      【解决方案2】:

      嗯,这个问题是 6 年前提出的。也许Android 4.0还没有出现? 实际上,在Android 4.0之后,android.view.View的Canvas是硬件加速的canvas,也就是说它是由OpenGL实现的,所以你不需要使用其他方式来提高性能。

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

      【讨论】:

        【解决方案3】:

        你说得对,SurfaceView 在底层使用了 Canvas。主要区别在于,SurfaceView 使用另一个线程来进行实际绘图,这通常会提高性能。不过,这听起来对你帮助不大。

        您是正确的,OpenGL 可以非常快速地进行旋转,所以如果您需要更高的性能,那就是要走的路。您可能应该使用 GLSurfaceView。使用 OpenGL 的主要缺点是做文本真的很痛苦。基本上你必须(好吧,不必,但似乎是最好的选择)渲染文本的位图。

        【讨论】:

        • 幸运的是,我不会做任何文本,只是 Android 路径,所以文本问题可能不会出现。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 2017-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多