iOS 图形绘制(一)-框架
1.iOS、MacOS系统图形架构
iOS 提供了两套绘图框架,分别是
UIBezierPath
和 Core Graphics
。 UIBezierPath
属于 UIKit
。UIBezierPath
是对 Core Graphics
框架的进一步封装。OpenGL
和 Core Graphics
都是绘图专用的 API 类族,调用图形处理器(GPU)进行图形的绘制和渲染。在架构上是平级的,相比 UIkit
更接近底层。
2. UIBezierPath
用于创建基于矢量的路径,如圆形、椭圆形和矩形,或者由多个直线和曲线组成的形状。绘图步骤也非常的简单:
(1)重写 drawRect:
方法
(2)创建 UIBezierPath
对象
(3)设置绘图属性
(4)渲染
3.Quartz
在介绍 Core Graphics
之前,我们先把 Quartz
的概念理顺清楚。
Quartz
由 Quartz Compositor
和 Quartz 2D
两部分组成
Core Graphics
是基于 Quartz
框架的 2D 绘图引擎。所以很多资料将 Core
Graphics称为
Quartz是不准确的
Core Graphics同
Quartz 2D是等价的
Quartz Extreme是针对
Quartz底层的
GPU加速
Quartz仅使用
OpenGL的命令集,直接连接
AGP(图形加速接口)
Quartz在
CPU上执行绘图命令,在
GPU上最终合成成图形
QuartzGL是
Quartz 2DAPI 的
GPU加速。启用
QuartzGL后,所有
Quartz绘图命令都将转换为
OpenGL命令并在
GPU上执行。这个模式默认是关闭的
Quartz在进行 3D 图形渲染时是基于
OpenGL的,通过
OpenGL连接
AGP`
4.Core Graphics
Core Graphics
是基于 Quartz
框架的高保真输出 2D 图形的渲染引擎。可处理基于路径的绘图、抗锯齿渲染、渐变、图像、颜色管理、PDF 文档等。 Core Graphics
提供了一套 2D 绘图功能的 C 语言 API,使用 C 结构体和 C 的函数模拟了一套面向对象的编程机制。Core Graphics
中没有 OC 的对象和方法。
无论图片、PDF 还是视图的图层,都是由 Core Graphics
框架完成绘制的。UIImage
、UIBezierPath
和 NSString
都提供了至少一种用于在 drawRect:
中绘图的方法,实现原理是将 Core Graphics
代码封装在其中,降低绘图难度。
Core Graphics 能完成的工作:
(1)绘制图形 : 线条、三角形、矩形、圆、圆弧弧等
(2)绘制文字
(3)绘制生成图片(图像)
(4)读取生成 PDF
(5)绘制渐变
Core Graphics
相比 UIBezierPath
在使用上更复杂一些,但是支持的效果也更多,程序运行效率更高。所以现在 iOS 系统上绘图需求基本上都使用 Core Graphis
来完成。
5.OpenGL
&& OpenGL ES
OpenGL ES
是 OpenGL
三维图形 API 的子集,针对嵌入式操作系统设计。iOS 和 Android 都在系统内集成了 OpenGL ES
。所以针对 OpenGL ES
的代码可以实现跨平台,大多数游戏框架都基于 OpenGL
。
6.总结
UIBezierPath
的优势是方便,能用最少的代码得要想要的图形,并且不需要管理图形上下文、缓冲区等容易出问题的地方,只需要关注图形本身就行了。最主要的缺点是支持的效果有限,当需要实现一些复杂图形、复杂渐变效果的时候就无能为力了。所以如果只是一个简单的图形没有特别的要求,可以用 UIBezierPath
实现。
Core Graphics
的功能就比 UIBezierPath
强大很多,使用起来也更复杂,而且需要自己管理图形上下文,需要投入更多的开发工作量。在效率和可做更多工作这两个方面上 Core Graphics
全面压制 UIBezierPath
,所以如果是复杂的图形、多个图形叠加、多种颜色渐变等需求可以使用 Core Graphics
实现。
OpenGL ES
是直接操作 GPU
绘图,而 Core Graphics
框架是先把命令输入到 CPU
再调用 GPU
绘图。很明显 OpenGL ES
绘图的效率更高,使用 OpenGL ES
绘图也可以实现跨平台,而 Core Graphics
只能在 iOS 系统中使用。相比 Core Graphics
只支持 2D 绘图,OpenGL ES
对 2D\3D 都有很好的支持。