【问题标题】:Performance: Quartz2D vs OpenGL ES (GLKit)性能:Quartz2D 与 OpenGL ES (GLKit)
【发布时间】:2012-08-25 04:05:17
【问题描述】:

我正在做一个项目,您可以在其中使用触摸在屏幕上绘图。我曾想过为此使用 OpenGL,但是我遇到了两个示例;一个使用 OpenGL,另一个使用 Quartz2D。

Example project from Apple, GLPaint, using OpenGL

Example project from EffectiveUI using Quartz2D

让我印象深刻的是,Quartz 实现比 OpenGL 实现快得多。我一直认为 OpenGL 会更快,因为它级别较低,几乎可以与硬件本身对话。我知道 Quartz2D 也使用 OpenGL 进行绘图,所以我的问题是;为什么 GLPaint 示例中的绘图这么慢?

您能否对 GLPaint 项目进行任何优化以提高性能?

【问题讨论】:

  • 这是在模拟器上还是在设备上?
  • 在实际设备上,iPhone 4S

标签: iphone ios opengl-es glkit


【解决方案1】:

OpenGL 绝对可以达到 Quartz 无法达到的水平,但由于水平如此之低,通常需要专家才能达到该水平。 Quartz 已经由专家编写,只要您能在其限制范围内生活,它应该是您绘图应用程序的完美 API。

根据我自己的经验,我经常转向使用 Quartz 自定义 UIKit,因为我很少需要使用 OpenGL 来提高性能。当我构建自定义 OpenGL 实现时,通常是因为 Quartz 无法完成我不需要的复杂动画,因为它在简单动画上表现不佳。

【讨论】:

    【解决方案2】:

    众所周知,在模拟器上,Quartz 2D 可以比 OpenGLES 快大约 5 倍,因为 OpenGLES 没有在那里进行硬件加速(不同的芯片组,ARM 与 i386)。

    我强烈建议您在设备上使用 OpenGLES 进行测试并将其与 Quartz 2D 进行比较,然后您应该会体验到 OpenGLES 的 2 倍性能增强。

    使用 OpenGL 时要考虑的另一件事是图像处理。 OpenGL 不是为此而设计的,因此只有一个图像缓冲区,这意味着一次实际上只能有一个图像在 GPU 中。作为补偿,请尝试使用类似TexturePacker 的程序制作纹理图集(作为 PVRTC)以加载到 OpenGL 中,您应该会获得一些巨大的性能提升。

    考虑到上述情况,请记住 GLPaint 实际上并不是在其实现中绘制线条,而是尝试在帧缓冲区上绘制一个半透明的 PNG,然后对其进行相应的着色。这是非常昂贵的,我建议将苹果与苹果进行比较(OpenGL 线图与 Quartz 线图)

    让我们面对现实 - OpenGL 已经过时了,因此必须照原样对待 - 一条老狗。你不能教这只老狗新的把戏,但它知道的把戏非常好。

    另一方面,Quartz 是一只新狗——虽然它可以做很多花样,但它不能把一件事做得特别好——表演它们。对于中等复杂的项目来说没问题,但对于任何主要的项目,我总是推荐 OpenGL,或者在它之上使用一个精简的 C++ 包装器。

    【讨论】:

    • 我知道模拟器的情况,所以我总是在普通的 iPhone 4S 上测试它。不过感谢您的评论!
    • @JeroendeLeeuw 请确保您看到了我更新的关于 GLPaint 的具体段落,它解释了您看到的一些性能问题。
    • 再次感谢,我已经阅读了它,我明白为什么它变慢了。但我也很好奇是否可以对 GLPaint 项目进行任何优化。
    • 很棒的解释@RichardJ.RossIII +1
    • @JeroendeLeeuw 当然有。一方面,使用实际的线条可以显着提高 GL 的性能,虽然圆角可能有点麻烦,但您可以使用 glEnable(GL_POINT_SMOOTH) 来消除点的锯齿。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多