iOS构建流畅的交互界面--卡顿产生的原因

[iOS 保持界面流畅的技巧 | Garan no dou](http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/)

确定好Vsync信号产生的时间点,由硬件或软件(某个线程)确定好时间点,然后通知各个模块,每个模块都以系统时间为基点。

 iOS设备双缓冲机制:

显示系统通常会引入两个帧缓冲区,双缓冲机制。
android设备的垂直同步机制:
[Vsync垂直同步信号分发和SurfaceFlinger响应执行渲染流程分析(一) - 红旺永福
- 博客频道 - CSDN.NET](http://blog.csdn.net/sinat_22657459/article/details/52733375)
先判断是否有硬件模块支持,没有硬件模块支持,就启动一个VSyncThread来执行产生垂直同步信号。

  •  由硬件产生:执行初始化时注册硬件回调
  • 由软件产生:
    获取当前时间点和产生信号的时间,计算中间要休眠的时间。
    休眠的时间小于0,说明上一个Vsync信号已经被错过,需要重新计算下一次的Vsync的产生时间:1. 采用定时回调 2. 采用休眠的形式主动等待

画面撕裂现象:
当视频控制器还未读取完成时,即屏幕内容刚显示一半时,GPU 将新的一帧内容提交到帧缓冲区并把两个缓冲区进行交换后,视频控制器就会把新的一帧数据的下半段显示到屏幕上,造成画面撕裂现象。
GPU 垂直同步机制 V-Sync:解决画面撕裂现象:
当开启垂直同步后,GPU 会等待显示器的 VSync 信号发出后,才进行新的一帧渲染和缓冲区更新。这样能解决画面撕裂现象,也增加了画面流畅度,但需要消费更多的计算资源,也会带来部分延迟。

 

界面卡顿的原因:
在Sync信号到来后,系统图形服务会通过CADisplayLink等机制通知App,App主线程开始在CPU中计算显示内容,比如视图的创建,布局计算,图片解码,文本绘制等。随后CPU会将计算好的内容提交到GPU去,由GPU进行交换,合成,渲染。随后GPU会把渲染结果提交到帧缓冲区,等待下一次VSync信号(垂直同步信号)到来时显示到屏幕上。由于垂直同步机制,如果在一个VSync时间内,CPU或者GPU没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏因为没有新的刷新,会保留之前的内容不变。这就造成了卡顿。
总结:掉帧导致了卡顿,而CPU和GPU只要有一个计算速度慢都会导致掉帧(没有在相邻的两个垂直同步信号之间完成计算)。
解决:分别对CPU和GPU压力进行评估和优化。

posted @ 2017-01-22 23:31  ShellHan  阅读(894)  评论(0编辑  收藏  举报