iOS_知识点_动画&图形绘制
一、前言
-
参考链接
lyh:Swift_动画
-
实现动画方式
iOS中实现动画有两种方式,
一种是自己不断的通过drawRect:方法来绘制
另外一种就是使用核心动画(Core Animation)
-
名词解释
二、系统层级介绍
上半部分属于 Cocoa touch 层
下部分 Media层
再往下还有 Core Services 、Core OS层
- UIKit:最常用的视图框架,封装度最高,都是OC对象
- CoreAnimation:提供强大的2D和3D动画效果
- CoreGraphics:主要绘图系统,常用于绘制自定义视图,纯C的API,使用Quartz2D做引擎
- OpenGL-ES:主要用于游戏绘制,但它是一套编程规范,具体由设备制造商实现
傻傻分不清:Quartz2D、QuartzCore、CoreAnimation、CoreImage、CoreGraphics
常见名字解释
- Quartz2D是CoreGraphics的一部分API的抽象,不是实际存在的.framework
- CoreGraphics定义了颜色、位置、字体、路径、图片等UIKit的常见属性。是构成UIKit的基石。
- QuartzCore和CoreAnimation是雌雄同体的同义词。
- CoreAnimation定义了动画类来对layer做动画,定义了layer来呈现内容。定义了仿射变换来做3D动画。
- CoreImage定义了滤镜,来对图片进行颜色过滤混合等操作。
- UIBezierPath对象是CGPathRef数据类型的封装
quartz是一个通用的术语,用于描述在IOS和MAC OS X中整个媒体层用到的多种技术 包括图形、动画、音频、适配。 Quart 2D 是一组二位绘图和渲染API,Core Graphic会使用到这组API Quartz Core 专指Core Animation用到的动画相关的库、API和类
Quartz 2D的API来自于Core Graphics框架
quartz 2D是一个二维绘图引擎,同时支持iOS、tvOS、macOS
可完成的工作
1》绘制图形、文字
2》绘制、生成图片(图像)
3》读取、生成PDF文件
4》图片的裁截:圆形裁剪
5》自定义控件
PS:
CALayer动画 ❤️❤️❤️❤️❤️
iOS CALayer仿射变换与3D变换(CGAffineTransform、 CATransform3D)
三、CoreAnimation
PS:在iOS9.0+以后,核心动画又加入了CASpringAnimation(弹性动画),CASpringAnimation继承自CABasicAnimation。
四、坐标系
iOS:左手坐标系 Mac:右手坐标系
上图,iOS坐标系中,确定旋转正方向
iOS坐标
五、图形绘制
六、离屏渲染
iOS 离屏渲染原因 ❤️
正常渲染:
- 在GPU的渲染流程中,根据
由远及近
的顺序显示图像到屏幕上,依次将结果存储到帧缓冲区
- 视频控制器从
帧缓冲区
中读取数据,然后显示到屏幕上后,会立即丢掉改帧数据
离屏渲染
如果我们对视图做了特殊处理:圆角、阴影等。GPU需要对图像进行额外的渲染、合并,然后将每个图层
处理结果存入到离屏缓冲区
,再将多个图层进行叠加合并,存入帧缓冲区
,最后显示到屏幕上
- 离屏缓冲区会带来方便的同时,也会带来严重的性能问题。因为需要额外开辟一个缓存区存放数据,并且还需要转存到
帧缓冲区
也是耗时的
- 因为一些特殊效果的处理,并不能一次性完成,需要使用
离屏缓冲区
来保存中间转态,是系统自动触发的,例如圆角、阴影、高斯模糊、光栅化等
- 可以提高渲染效率,如果一个效果是多次实现的,可以提前渲染,保存到离屏缓冲区,以达到复用的目的。这种情况是需要开发者手动触发的
设置以下属性,会触发离屏渲染
shouldRasterize(光栅化)
masks(遮罩)
shadows(阴影)
edge antialiasing(抗锯齿)
group opacity(不透明)
复杂形状设置圆角等
渐变
光栅化
光栅化就是把layer转化为位图的过程。
如果有很多的子图层或者有复杂的效果应用,开启shouldRasterize就会比重绘所有事务的所有帧划得来得多。但是光栅化原始图像需要时间,而且还会消耗额外的内存。所以需要根据实际情况取舍。
应用场景
1、提升复杂层级视图的性能
2、提升动画性能(对一个层级复杂的视图做动画时,也可以启用shouldRasterize避免GPU每帧都重新合成。)
不适合的场景
在一个经常会变化的layer中开启shouldRasterize是没有多大意义的,因为缓存的总是会被重新创建,而光栅化还要消耗性能,没准适得其反。
下面是开发工具提供的几个常用的测量方式:
-
Instrument的Core Animation可以监控Core Animation的性能,我们可以用它监控FPS等指标。
-
Xcode->Debug->View Debuging->Rendering->Color Offscrenn-rended Yellow
可以为触发了离屏渲染的layer着黄色。 -
Xcode->Debug->View Debuging->Rendering->Hits Green and Misses Red
这个指标可以反映我们通过尝试开启shouldRasterize提升性能的时候是不是达到了预期效果。 当使用shouldRasterize属性的时候,耗时的图层绘制会被缓存,然后当做一个简单的扁平图片呈现。当缓存再生的时候这个选项就用红色对栅格化图层进行了高亮,缓存被重复使用的话就会以绿色进行高亮。如果缓存频繁再生的话(红色太多),就意味着栅格化可能会有负面的性能影响了。
七、专项_UIBezierPath
UIBezierPath + CAShapeLayer
- UIBezierPath对象是CGPathRef数据类型的封装
1、startAngle & endAngle 取值
八、Demo
UIBesize
1、HXCharts包括了仪表盘、柱状图、圆形图、折线图、环形图等五种绘图。
2、抖音加载动画
动画逻辑
九、数学知识
向量
在平面直角坐标系中,分别取与x轴、y轴方向相同的两个单位向量i,j作为一组基底。a为平面直角坐标系内的任意向量,以坐标原点O为起点P为终点作向量a。由平面向量基本定理可知,有且只有一对实数(x,y),使得a=xi+yj,因此把实数对(x,y)叫做向量a的坐标,记作a=(x,y)
在空间直角坐标系中,分别取与x轴、y轴,z轴方向相同的3个单位向量i,j,k作为一组基底。若为该坐标系内的任意向量,以坐标原点O为起点作向量a。由空间基本定理知,有且只有一组实数(x,y,z),使得a=ix+jy+kz,因此把实数对(x,y,z)叫做向量a的坐标,记作a=(x,y,z)。