OpenGL ES真的这么快吗?为什么?与在Quartz 2D中绘制这些东西相比,在OpenGL ES中绘制如此简单的东西真是太可怕了吗?
例如,我有一个带-drawRect的UIView子类:已实现,我画了一些线条,曲线和圆圈。只是简单的路径,有一些阴影。
在OpenGL ES中我该怎么办?是不是有这个漂亮的EAGLView图层的东西?我想到的一件事是触摸事件如何进入OpenGL ES?也许这是关于它的复杂事情?是否有关于OpenGL ES中基本绘图操作的教程?
答案 0 :(得分:9)
基于your earlier question,我假设您想要切换到OpenGL的原因是为了加速绘制元素的动画。在那个问题中,你试图通过每帧用Quartz重绘UIView的内容来制作动画。由于iPhone绘图系统的工作方式,这将非常慢。每一帧,您的视图的背景层都需要转换为纹理并重新上传到GPU,这是一组非常缓慢的操作。
正如已经指出的那样,除非你愿意使用像Cocos2D这样的第三方框架,否则为此采用纯OpenGL ES的方式需要花费大量的时间和精力。即便如此,我敢打赌,你会发现绘制复杂的二维元素比使用Quartz更难或更难。
相反,我的建议是不要尝试通过在Quartz中每帧重新绘制动画来制作动画,而是通过分层绘图并使用Core Animation来移动这些图层。即使在最初的iPhone OS设备上,我发现我可以使用Core Animation以每秒60帧的速度为50个半透明层设置动画。使用Quartz进行绘图的Core Animation比OpenGL ES更容易使用,并且如果正确完成,可以让您达到接近相同级别的性能。相信我,我已经用过了。
即使您需要在更改形状时为矢量元素设置动画,也可以使用CAShapeLayer之类的内容来处理该动画。
另请参阅my answer至this question。有关Core Animation入门的资源,请参阅我的回答here。
答案 1 :(得分:2)
它们是两个完全不同的东西:
Quartz2D 提供了一种画布,你可以使用API来绘制东西,这些API有很多商品可以像你说的那样做基本的事情:线条,多边形,blitting图像,bezier路径,阴影等......当然你不能超越这些功能,因为它是一个非常高级的API,可以做很多简单的事情,但仅此而已
OpenGL ES 是一个非常低级的API,允许您完全控制将要显示的内容,您甚至可以从原语构建简单的内容(那么它取决于我们是否谈论ES1.0或ES2.0,它们是完全不同的。它基本上是跨平台的,它旨在用于指示GPU显示什么以及如何显示它。
即使简单的事情也可能因OpenGL ES而变得复杂,因为它非常灵活,因此您需要了解许多概念,将所有概念放在一起,并创建场景。例如,你没有一个真正的“圆”原语,你要做的是在纹理上绘制由许多小块组成的形状,然后将纹理绘制到显示器的真实四边形上,然后用它来移动你的绕圈子。
然后,OpenGL中的所有内容都是使用转换矩阵制作的,转换矩阵是用于旋转,平移或缩放场景中对象的工具。它们是一个非常优雅和光滑的工具,但与通常使用Quartz2D相比,它们需要更强的数学背景。
此外,如果您打算使用OpenGL ES2.0进行开发,而不是ES1.0更复杂:在2.0之前,您具有向后兼容性,允许您使用基本功能,如glTranslate
或{{ 1}}用于翻译或旋转被绘制的东西。使用2.0,他们删除了所有这些只留下着色器的方法,所以你要开发的所有东西都是着色器,它们将被编译并发送到GPU执行:这在开始时非常顽皮,你必须清楚地了解它是如何OGL管道工作,片段着色器或像素着色器是什么等等。
我的两分钱:OGL比Quartz2D要冷得多,但是它很难学习,因为它需要了解很多主题,而且由于OGL ES是一个不太老的标准,文档在某种程度上缺乏(因此它更容易开始)简单的OGL,然后采取ES)所需的。
性能说明:由于OGL ES只使用GPU来完成肮脏的工作,与Quartz2D相比,它确实更快。
答案 2 :(得分:1)
对于简单的事情,Quartz 2D工作正常,而且非常简单。如果您遇到性能问题,请转到OpenGL。
答案 3 :(得分:1)
典型的表演寻求之旅:
IMO:
只是我的0.02