性能:Quartz2D与OpenGL ES(GLKit)对比

5
我正在开发一个可以使用触摸屏幕进行绘制的项目。我想使用OpenGL来完成,但是我遇到了两个例子:一个使用OpenGL,另一个使用Quartz2D。 苹果公司的示例项目GLPaint,使用OpenGL EffectiveUI的示例项目,使用Quartz2D 令我惊讶的是,Quartz实现比OpenGL实现要快得多。我一直以为OpenGL会更快,因为它更低级,几乎可以直接与硬件通信。我知道Quartz2D也在使用OpenGL进行绘制,所以我的问题是:为什么GLPaint示例中的绘图速度这么慢? 您能对GLPaint项目进行任何优化以提高性能吗?

这是在模拟器上还是设备上? - Richard J. Ross III
在实际设备上,iPhone 4S - Jeroen de Leeuw
2个回答

6
众所周知,在模拟器上,Quartz 2D 大约比 OpenGLES 快 5 倍,因为在那里 OpenGLES 没有硬件加速(不同的芯片组,ARM vs i386)。
我强烈建议您在设备上使用 OpenGLES 进行测试,并将其与 Quartz 2D 进行比较,这样您应该会获得大约 2 倍的性能提升。
在使用 OpenGL 时需要考虑的另一件事是图像处理。OpenGL 并不适用于此,因此只有一个图像缓冲区,这意味着 GPU 中实际上只能有一个图像。为了补偿这一点,尝试使用像 TexturePacker 这样的程序制作纹理图集(作为 PVRTC)加载到 OpenGL 中,您应该会获得巨大的性能提升。
考虑到以上问题,请记住 GLPaint 实际上并没有在其实现中绘制线条,而是试图在帧缓冲区上绘制半透明的 PNG,然后相应地进行着色。这非常昂贵,我建议您将苹果和苹果进行比较(OpenGL 线条绘制 vs Quartz 线条绘制)。
让我们面对现实 - OpenGL 已经老旧,因此必须按其老旧的方式处理 - 它是一只老狗。你无法教这只老狗新的把戏,但它擅长自己所知道的技巧。
另一方面,Quartz 是一只新狗 - 虽然它可以做很多把戏,但它不能特别擅长执行它们。对于中等复杂度的项目来说还好,但对于任何重要的项目,我总是会推荐使用OpenGL,或者是一个薄的C++包装器。

我知道模拟器的情况,所以我总是在普通的iPhone 4S上测试它。不过还是谢谢你的评论! - Jeroen de Leeuw
@JeroendeLeeuw,请确保您已经看到我关于GLPaint的更新段落,其中解释了您所见到的一些性能问题。 - Richard J. Ross III
谢谢,我已经阅读并理解了为什么这会比较慢。但我非常好奇GLPaint项目是否有任何优化的空间。 - Jeroen de Leeuw
@JeroendeLeeuw 当然有。首先,使用实际线条可以大幅提高GL的性能,尽管圆角可能会有些麻烦,但您可以使用glEnable(GL_POINT_SMOOTH)来进行点抗锯齿处理。 - Richard J. Ross III
谢谢,我觉得这个就会帮助很多了。如果您有其他建议,可以随意在评论中留言! - Jeroen de Leeuw

1

OpenGL 肯定可以达到超越 Quartz 的水平,但由于它是如此低级别的,通常需要专家才能达到那个水平。Quartz 已经由专家编写,只要您能在其限制范围内生存,它应该是您绘图应用程序的完美 API。

根据我的经验,我经常使用 Quartz 自定义 UIKit,因为我很少需要为了性能而使用 OpenGL。当我构建自定义 OpenGL 实现时,通常是因为 Quartz 无法执行我需要的复杂动画,而不是因为它在简单动画上表现不佳。


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