iOS:核心图像是否基于OpenGL实现?

11

我发现了一张图表,显示Core Graphics实现在OpenGL之上,另一张则将其与OpenGL并列。我认为苹果应该聪明地让它们都可以平等地访问图形硬件,但是我对他们所使用的图形芯片不太了解...也许这是纯3D?

这里有人知道具体情况吗?

4个回答

20

是的,在iOS上,核心图形(Core Graphics)似乎是建立在OpenGL ES之上进行屏幕绘制,但并不是我们可以直接访问的显式方式。

核心图形将矢量元素(线条、弧线等)和一些栅格元素(图像)处理成可显示于屏幕或其他输出形式(PDF文件、打印等)的形式。如果目标是iOS屏幕,这些矢量元素将托管在一个CALayer中,可以直接通过UIView的后备层或间接地实现。

这些核心动画(Core Animation)层本质上是GPU上矩形纹理的包装器,这就是为什么即使在最初的iPhone硬件上,Core Animation仍然可以提供对层平滑转换、缩放和旋转的支持。我现在找不到相关资料,但至少有一个WWDC演示表明,OpenGL ES被Core Animation用于与GPU通信以执行此种硬件加速。在新款双GPU的MacBook Pro上也可以观察到类似的情况,当与使用Core Animation的应用程序交互时,更强大的GPU会启动。

因为当Core Graphics将矢量和栅格元素光栅化为CALayer时,而CALayer又有效地包装在OpenGL ES纹理周围,所以我会将OpenGL ES置于iOS上Core Graphics之下,但仅在Core Graphics渲染到屏幕时。你看到的平行排列可能由以下三个因素造成: 在Mac上,并非所有视图都带有后备层,因此它们可能没有以同样的方式进行硬件加速; 我们无法真正与标准UI元素的OpenGL ES后备交互,因此从开发人员的角度来看,它们是不同的概念; 以及核心图形可以用于向离屏上下文(如PDF文件或图像)进行渲染。


真的很酷。过去曾经尝试在OpenGL上实现X服务器...不确定效果如何。还有一套基于OpenGL工作的小部件集,叫做GLUI,我也用过并取得了不错的效果。苹果一如既往地付出额外的努力来制造最好的产品。 - user945620
5
我很难相信这个。在 CG 绘图测试应用程序(在 iOS 6 上)中,我看到的性能远低于 GL 后台系统提供的性能水平(在 iPhone 4S 上绘制几个大路径的填充和描边只给我 12 帧每秒),OpenGL ES 分析工具报告“无 GL 数据”,63% 的 CPU 时间(在这个 CG 演示应用程序中)被花费在 CG 的 argb32_mark 和 blitting 子函数上,另外 23% 花费在 aa_render 上。如果这里有 GL,则它并未用于与绘图相关的任何事情。 - Slipp D. Thompson
就CG和CA使用GL进行组合的论点而言——仿射变换我能看出来,但仅此而已。我不会称其为在GL上“分层”CG;要让CG在GL上“分层”,它的功能必须是GL所做的抽象,但仍然只使用GL。似乎对于CG的很大一部分来说,这并不是真的。就此而言,iOS中的所有绘图最终都会落到GL多边形上,这就是苹果公司能够在每个应用程序中添加多任务栏和通知中心处理程序而没有问题的原因。但这并不意味着这些应用程序中的绘图例程正在使用GL。 - Slipp D. Thompson
7
@SlippD.Thompson - 是的,Core Graphics 在 CPU 端进行所有光栅化,并仅将最终位图上传到纹理中。我尝试表达这一点,但或许我的措辞不够清晰。在 Mac 上,他们仍在尝试使用 Quartz Extreme 和 OpenGL 进行实际绘制,但我不知道我们是否会在 iOS 上看到这种情况出现。 - Brad Larson

7
核心图形和OpenGL是两个完全独立的系统。请看下面的图片(来源:这里),显示两者都列在同一级别上。同一页下面核心图形的描述还表明,它是最低级别的本地绘图系统。 enter image description here 另请参阅有关OpenGL ES页面。它显示OpenGL代码直接在GPU上运行,如果您向下滚动,您会发现有一些无法使用OpenGL的应用程序。显然,如果CG基于OpenGL,您将永远无法做到这些事情。
最后,请查看iOS的绘图模型页面。在顶部,它将OpenGL与本地绘图进行比较,表明它们互相独立工作。

在iOS上,我不认为这是正确的。正如我在我的答案中指出的那样,iOS上的每个显示元素都是层支持的,并且这些层是GPU加速的,因此任何绘制到它们中(比如Core Graphics)的东西应该被分层到OpenGL ES上。在Mac上,情况并非总是如此,这就解释了Quartz和OpenGL在该平台上的独立性。 - Brad Larson
想一想这是多么具有讽刺意味。Macs&PCs和X11使用合成而不是2D在3D之上的原因是这样做使用更少的资源。使用3D硬件来显示像2D xterm窗口这样的东西真的没有任何意义。然而,在资源受限的iOS设备上,苹果采取了一种更加耗费资源的方法。 - user945620
1
@BradLarson 1) 核心图形不必绘制到视图中。您可以创建一个上下文,它从不与核心动画交互。2) 图层不负责显示内容。它所做的只是在视图显示之前转换/动画化核心图形上下文。如果不需要任何转换/动画,则无需执行任何操作。 - ughoavgfhw
2
我的观点是,尽管iOS上的视图系统可能使用OpenGL,但核心图形并不使用。 - ughoavgfhw
@BradLarson 我认为你对“每个显示元素”的定义过于宽泛。经过我的检查,似乎CocoaTouch元素(即UIView及其派生类)都是CALayer支持的,而CoreGraphics绘制调用则不是。以下是一个示例堆栈跟踪:cl.ly/N7Ss - Slipp D. Thompson
显示剩余2条评论

3

核心图形和OpenGL是两种不同的技术。UIKit和AppKit都是基于它们以及核心动画构建的。你可以在苹果的文档中看到这个图形技术堆栈(Core Animation编程指南)。


1
自iOS 9起,iOS上的Core Graphics基于苹果的Metal框架,而不是OpenGL。

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