iOS UI 显示的原理及优化策略

理解 VSync

iOS 图像显示原理及卡顿掉帧的原因

iOS图形学(三):屏幕成像原理

 

iOS图像显示原理

关于CPU和GPU两个硬件都是通过总线连接起来的,CPU主要处理UI的布局和一些文本信息的计算以及整个绘制过程图片编解码,最后在合适的时机提交位图给GPU。而我们的GPU则是负责对位图进行渲染,最后将渲染好的位图放到帧缓冲区。随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,经过可能的数模转换传递给显示器显示。

iOS 图片选择和显示 ios图片显示出来的原理_App

 

iOS 图片选择和显示 ios图片显示出来的原理_App_02

 

 

iOS 图片选择和显示 ios图片显示出来的原理_位图_03

 

 

iOS 图片选择和显示 ios图片显示出来的原理_iOS 图片选择和显示_04

 

 

 

 

 

纹理格式 是能被 GPU 所识别的像素格式,能被快速寻址并采样。

 之后 GPU 就要做他最牛逼也是最擅长的事了 – GPU 会将众多的纹理进行合成,其中就利用到了从 CPU 处传来的透明值等纹理显示的信息

 

卡顿原因

VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始在 CPU 中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。随后 CPU 会将计算好的内容提交到 GPU 去,由 GPU 进行变换、合成、渲染。随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。由于 垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变。这就是界面卡顿的原因。

 

 

三重缓存原理(这里并不代表iOS实际缓存原理)

  • VSync 信号负责调度从 Back Buffer 到 Frame Buffer 的复制操作
  • Back Buffer:后备缓冲区
  • Frame Buffer:帧缓冲区
  • VSync的引入是解决tearing问题
  • 二级缓存:在这种模型下,只有当 VSync 信号产生时,CPU/GPU 才会开始绘制。这样,当帧率大于刷新频率时,帧率就会被迫跟刷新频率保持同步,从而避免“tearing”现象。
  • 三级缓存是解决jank

 

下图为三级缓存,比二级多了一个back buffer

iOS 图片选择和显示 ios图片显示出来的原理_位图_05

 

 

iOS 图片选择和显示 ios图片显示出来的原理_位图_06