iOS_知识点_动画&图形绘制

一、前言

  • 参考链接

 iOS 动画篇(一) Core Animation 

   11 个例子,由浅到深,学习 iOS 动画 

   lyh:Swift_动画

  • 实现动画方式

 iOS中实现动画有两种方式,

  一种是自己不断的通过drawRect:方法来绘制

  另外一种就是使用核心动画(Core Animation)

 

  • 名词解释

仿射变换,又称仿射映射,是指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。
 

 

  • UIView、CALayer

CALayer动画 ❤️❤️❤️❤️❤️

iOS Rendering 渲染全解析 ❤️

iOS学习笔记——动画基础

CALayer能做什么 

  • 图形阴影,边框,圆角等。

  • 仿射变换。

  • 3D变换。

  • 透明遮罩,多级非线性动画...

二、系统层级介绍

上半部分属于 Cocoa touch 层

下部分 Media层

再往下还有 Core Services 、Core OS层

CoreGraphics系列学习(一)

  • 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编程指南

Quartz 2D的API来自于Core Graphics框架

quartz 2D是一个二维绘图引擎,同时支持iOS、tvOS、macOS

可完成的工作

  1》绘制图形、文字

  2》绘制、生成图片(图像)

  3》读取、生成PDF文件

  4》图片的裁截:圆形裁剪

  5》自定义控件

 

PS:

  OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机、PDA和游戏主机等嵌入式设备而设计。
 
 

CALayer动画 ❤️❤️❤️❤️❤️

iOS CALayer仿射变换与3D变换(CGAffineTransform、 CATransform3D)

 

三、CoreAnimation

PS:在iOS9.0+以后,核心动画又加入了CASpringAnimation(弹性动画),CASpringAnimation继承自CABasicAnimation。

 

四、坐标系

iOS学习笔记——动画基础(内含坐标系解释)

   

 iOS:左手坐标系       Mac:右手坐标系  

 

 

  上图,iOS坐标系中,确定旋转正方向

 

iOS坐标

 

CoreGraphics系列学习(一)

 

五、图形绘制

iOS_2022_CALayer

iOS绘画的三种方式

iOS:UIView类中 drawRect 方法理解

 1、在UIView的子类方法drawRect:中,使用UIKit在Cocoa为我们提供的当前上下文中完成绘图任务。(UIBezierPath)
 2、在UIView的子类方法drawRect:中,使用Core Graphics实现绘制。
 3、在UIView子类的drawLayer:inContext:方法中实现绘图任务
  drawLayer:inContext:方法是一个绘制图层内容的代理方法。为了能够调用drawLayer:inContext:方法,需要设定图层的代理对象。但要注意,不应该将UIView对象设置为显示层的委托对象,这是因为UIView对象已经是隐式层的代理对象,

六、离屏渲染

iOS 离屏渲染原因 ❤️

iOS shouldRasterize光栅化--离屏渲染

Quartz2D简介(包含离屏渲染)

 正常渲染:

  • 在GPU的渲染流程中,根据由远及近的顺序显示图像到屏幕上,依次将结果存储到帧缓冲区
  • 视频控制器从帧缓冲区中读取数据,然后显示到屏幕上后,会立即丢掉改帧数据

    

离屏渲染

如果我们对视图做了特殊处理:圆角、阴影等。GPU需要对图像进行额外的渲染、合并,然后将每个图层处理结果存入到离屏缓冲区,再将多个图层进行叠加合并,存入帧缓冲区,最后显示到屏幕上 

  • 离屏缓冲区会带来方便的同时,也会带来严重的性能问题。因为需要额外开辟一个缓存区存放数据,并且还需要转存到帧缓冲区也是耗时的
  • 因为一些特殊效果的处理,并不能一次性完成,需要使用离屏缓冲区来保存中间转态,是系统自动触发的,例如圆角、阴影、高斯模糊、光栅化等
  • 可以提高渲染效率,如果一个效果是多次实现的,可以提前渲染,保存到离屏缓冲区,以达到复用的目的。这种情况是需要开发者手动触发的

 

设置以下属性,会触发离屏渲染

  shouldRasterize(光栅化)
  masks(遮罩)
  shadows(阴影)
  edge antialiasing(抗锯齿)
  group opacity(不透明)
  复杂形状设置圆角等
  渐变

 

光栅化

如何使用shouldRasterize属性进行性能调优 ❤️

iOS shouldRasterize光栅化--离屏渲染

光栅化就是把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详解

UIBezierPath + CAShapeLayer 

  • UIBezierPath对象是CGPathRef数据类型的封装

 

1、startAngle & endAngle 取值

 

 

 

八、Demo 

UIBesize

1、HXCharts包括了仪表盘、柱状图、圆形图、折线图、环形图等五种绘图。

 2、抖音加载动画

动画逻辑

 

 

九、数学知识

向量

向量-百度百科

平面直角坐标系中,分别取与x轴、y轴方向相同的两个单位向量ij作为一组基底。a为平面直角坐标系内的任意向量,以坐标原点O为起点P为终点作向量a。由平面向量基本定理可知,有且只有一对实数(x,y),使得a=xi+yj,因此把实数对(x,y)叫做向量a的坐标,记作a=(x,y)

空间直角坐标系中,分别取与x轴、y轴,z轴方向相同的3个单位向量ijk作为一组基底。若为该坐标系内的任意向量,以坐标原点O为起点作向量a。由空间基本定理知,有且只有一组实数(x,y,z),使得a=ix+jy+kz,因此把实数对(x,y,z)叫做向量a的坐标,记作a=(x,y,z)。

向量的矩阵表示
 
 
矩阵
 
posted @ 2022-03-13 13:44  素染年华  阅读(133)  评论(0编辑  收藏  举报