iOS

iOS 图形绘制(一)-框架

2022-04-22  本文已影响0人  搬砖的crystal
1.iOS、MacOS系统图形架构

iOS 提供了两套绘图框架,分别是 UIBezierPathCore GraphicsUIBezierPath 属于 UIKitUIBezierPath 是对 Core Graphics 框架的进一步封装。
OpenGLCore Graphics 都是绘图专用的 API 类族,调用图形处理器(GPU)进行图形的绘制和渲染。在架构上是平级的,相比 UIkit 更接近底层。
2. UIBezierPath

用于创建基于矢量的路径,如圆形、椭圆形和矩形,或者由多个直线和曲线组成的形状。绘图步骤也非常的简单:
(1)重写 drawRect: 方法
(2)创建 UIBezierPath 对象
(3)设置绘图属性
(4)渲染

3.Quartz

在介绍 Core Graphics 之前,我们先把 Quartz 的概念理顺清楚。

QuartzQuartz CompositorQuartz 2D 两部分组成
Core Graphics 是基于 Quartz 框架的 2D 绘图引擎。所以很多资料将 CoreGraphics称为Quartz是不准确的Core GraphicsQuartz 2D是等价的Quartz Extreme是针对Quartz底层的GPU加速Quartz仅使用OpenGL的命令集,直接连接AGP(图形加速接口)QuartzCPU上执行绘图命令,在GPU上最终合成成图形QuartzGLQuartz 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 框架完成绘制的。UIImageUIBezierPathNSString 都提供了至少一种用于在 drawRect: 中绘图的方法,实现原理是将 Core Graphics 代码封装在其中,降低绘图难度。

Core Graphics 能完成的工作:
(1)绘制图形 : 线条、三角形、矩形、圆、圆弧弧等
(2)绘制文字
(3)绘制生成图片(图像)
(4)读取生成 PDF
(5)绘制渐变

Core Graphics 相比 UIBezierPath 在使用上更复杂一些,但是支持的效果也更多,程序运行效率更高。所以现在 iOS 系统上绘图需求基本上都使用 Core Graphis 来完成。

5.OpenGL && OpenGL ES

OpenGL ESOpenGL 三维图形 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 都有很好的支持。

上一篇下一篇

猜你喜欢

热点阅读