知识点总结

iOS 界面卡顿(掉帧)原因

2019-04-07  本文已影响28人  飞不越疯人院

界面卡顿的原因, 界面为什么会卡顿?

界面成像原理:

不论是以前的CRT还是现在的液晶显示器,成像原理是一致的;


CPU部分:逻辑的计算;计算好将要显示的内容转交给GPU;
GPU部分:GPU开始渲染后将结果换到帧缓冲区,随后视频控制器从帧缓冲区中读取数据,经过一系列的转换后交给显示器进行显示;

YYKit作者描述:首先从过去的 CRT 显示器原理说起。CRT 的电子枪按照上面方式,从上到下一行行扫描,扫描完成后显示器就呈现一帧画面,随后电子枪回到初始位置继续下一次扫描。为了把显示器的显示过程和系统的视频控制器进行同步,显示器(或者其他硬件)会用硬件时钟产生一系列的定时信号。当电子枪换到新的一行,准备进行扫描时,显示器会发出一个水平同步信号(horizonal synchronization),简称 HSync;而当一帧画面绘制完成后,电子枪回复到原位,准备画下一帧前,显示器会发出一个垂直同步信号(vertical synchronization),简称 VSync。显示器通常以固定频率进行刷新,这个刷新率就是 VSync 信号产生的频率。尽管现在的设备大都是液晶显示屏了,但原理仍然没有变。

界面卡顿原因:

滑动时稳定在60fps左右(玩游戏的同学应该都能理解fps的概念)就感觉不到卡顿;
网上查了下现在的屏幕一般的刷新率为60HZ

每秒展示出60帧画面就不会掉帧(卡顿现象);



也就是每帧画面的处理时间大概在16.7ms(1s/60 ≈16.7ms), 就不会出现卡顿现象;

知识点:每帧画面CPU+GPU的时间不能超过16.7ms, 如果超过16.7ms就会出现掉帧现象;


开发中遇到可能会造成卡顿的点

CPU部分:

  1. 对象的创建, 调整, 销毁;
  2. frame布局的计算, autolayout布局;
  3. 文本的计算和渲染;
  4. 图片的解码和绘制;

GPU部分:

  1. 纹理的渲染;
  2. 视图的混合;
  3. 图像的渲染;

补充部分

画面撕裂

画面撕裂出现原因: iOS采用双重缓存+垂直同步的方案;
GPU会先渲染一帧界面放到缓冲区中供视频控制器去显示, 当下一帧缓存好后视频控制器指向另一个缓存区; 这种机制可以提升效率,但是问题也随之而来, 假如视频控制器读取第一个缓存区内容尚未完成(即界面尚未完全显示), 这时GPU已经将下一帧界面渲染好放入缓存区内, 然后去展示另一个缓存区内的数据,
这样就会出现画面撕裂的现象;如图


垂直同步(简写也是 V-Sync)可以有效的解决这个问题;开启垂直同步后,GPU会等待显示器的VSync信号发出后才会进行新的一帧界面的渲染和缓存区更新, 这样可以提高画面的流畅度, 但是会消耗更多的资源;

资料参考连接
iOS 保持界面流畅的技巧
iOS 视图渲染以及性能优化总结

上一篇下一篇

猜你喜欢

热点阅读