iOS Graphics的实现方式简单探讨

最近在学习Open GL ES,作者总喜欢里面的一些特性和quartz进行对比,于是我开始怀疑对一些知识理解的正确性。

首先ios绘图依靠Quartz, Core Animation, UIKit和open GL ,以前一直认为Quartz和Core Animation的底层都是依靠Open GL来进行渲染,看来我大错特错了。我想很多人对这些框架的底层实现方式不是很了解或者概念比较模糊,查阅了大量资料说法也不一,通过和小伙伴@answer-huang 和 @xdream86 的探讨,得出一个相对明细的结论,下面慢慢道来。

上面的图是objc.io的一篇文章配图,(原文翻译链接),这张图很充分的说明了CoreGraphcis(下文用CG代替)和Core Animation(下文用CA代替)都是依靠Open GL来基于GPU驱动层进行渲染,真的是完全这样吗?

下图是苹果官方文档对于CA解释的层次图

可以看出 CA 的实现是基于Open GL和CG ,通过查看CA的头文件也证明了这一点,其中CATransform3D依靠的是opengl进行3D渲染,而其他2D动画通过CG进行渲染。接下来看,CG的下层直接是Graphics硬件层,这也证明了CG并不完全依靠openGL渲染(下文会介绍为什么是不完全)。

ios开发者对于CG不会陌生,许多人也称他为quartz,这是不准确的。Quartz 2D 作为苹果的为cocoa框架制作的绘图引擎,只是CG框架的一部分(其实是大部分),也就是CG的子集。所以CG的图形渲染除了依靠quartz之外其实还小部分依靠于Open GL。现在我们可以说objc.io给的层次配图不完全准确,因为CG不完全是依赖于Open GL.

下图是苹果官方文档对于QuickTime解释的层次图

看了 QuickTime 的层次图 ,发现 CG ,Core Image 和Core Video 也是依赖 Open GL的 ,当时并不是完全依赖(证实了CG部分使用Open GL渲染)。查Ccore Video的文档就会发现大部分关于open GL 的内容,视屏内容用Open GL 来渲染这也合情合理,CG和Core Image 应该只是用来呈现视屏中静态图像内容。

来说说UIKit,国内很多博客说UIkit是对quartz的封装,现在你可能已经知道这个说法太片面了。实际上UIKit构建于CA之上,因为CA构建于CG和于Open GL之上,所以UIkit直接可以和CG进行交互,当然也可以直接和Open GL进行交互。可以认为UIKit是苹果为了构建UI而对ios中其它绘图api的封装,也可以完成简单的用户UI定制操作,当然复杂的UI或者动画需要自己用CA,CG甚至Open GL去实现。

当初面试的时候面试官问做没做过quartz, 我愣了半天说绘图?他说不对,最后原来是coreText…毕竟CT也借助CG,姑且算他是广义上的quartz 吧^_^.. 这些都是查资料得出的结论,但也有资料相违背,大家有异议的可以 @Nidom

最后献上我所理解的层次图