iOS 关于iOS下渲染的理解

870 阅读3分钟

关于CPU与GPU

CPU(central Processing Unit):

 现代计算机整个系统的元算核心、控制中心是信息处理、程序运行的最终执行单元。

GPU(Graphics Processing Unit):

  显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器。

CPU 和 GPU 其设计目标就是不同的,它们分别针对了两种不同的应用场景。CPU 是运算核心与控制核心,需要有很强的运算通用性,兼容各种数据类型,同时也需要能处理大量不同的跳转、中断等指令,因此 CPU 的内部结构更为复杂。而 GPU 则面对的是类型统一、更加单纯的运算,也不需要处理复杂的指令,但也肩负着更大的运算任务。

因此,CPU 与 GPU 的架构也不同。 CPU 面临的情况更加复杂,因此从上图中也可以看出,CPU 拥有更多的缓存空间 Cache 以及复杂的控制单元,计算能力并不是 CPU 的主要诉求。CPU 是设计目标是低时延,更多的高速缓存也意味着可以更快地访问数据;同时复杂的控制单元也能更快速地处理逻辑分支,更适合串行计算。

而 GPU 拥有更多的计算单元 Arithmetic Logic Unit,具有更强的计算能力,同时也具有更多的控制单元。GPU 基于大吞吐量而设计,每一部分缓存都连接着一个流处理器(stream processor),更加适合大规模的并行计算。

着色器渲染过程

着色器渲染流程 大致可以分为以下几个步骤: openGL 中 顶点着色器 与片元着色器 是必不可少的

iOS下的渲染框架

CoreAnimation渲染

CoreAnimation渲染流水线

Render Server 操作分析

离屏渲染问题

通常情况下 计算机处理图片,只需要在帧缓存区进行处理,处理完成后直接显出到屏幕上,iOS使用双缓存技术,拥有离屏渲染区,什么情况下我们需要使用到离屏渲染区呢?简单来说:对于多个图层的处理时候处理完成后的图层并不能直接显示,有其他步骤需要处理等待所有图层处理完成后,需要得到最终混合的图层用来显示 这种情况下就需要用到离屏渲染

油画家算法

首先我们来思考下当计算机上有多个图层的时候,计算机是怎么绘制的呢?

如图,我们有3个颜色不同的图案,计算机在显示的时候并不是一次性绘制成功的,他是由远及近的开始绘制,首先绘制蓝色图层->红色图层->黄色图层,这也是画家算法的原理

我们也可以思考下 iOS中毛玻璃效果、切割圆角.设置mask、以及光栅的时候是怎样触发离屏渲染的?

以下是我们通过设置圆角来进一步了解 我们设置创建了5 个空间 1.2.3都是UIButton 4.5为UIImageView

开启离屏渲染

我们可以看到 2、5 并没有发生离屏渲染,2只是单纯的设置了背景色 ,5只是设置了UIImage ,其实本质上就是OC底层判断是否有多个图层需要混合渲染是否需要使用到离屏渲染缓存区,需要就发生会发生离屏渲染,值得注意的是离屏渲染区使用时效性的,当图片超过当前屏幕的2.5倍,或者加入离屏渲染缓存后300ms未处理,都会被抛弃