iOS 面试

iOS之武功秘籍⑳: 界面优化

2021-03-09  本文已影响0人  長茳

iOS之武功秘籍 文章汇总

写在前面

我们经常在面试中,会被问及关于界面优化相关的问题,比如为什么界面会出现卡顿?如何监控卡顿?接着如何解决卡顿?那么本篇文章将重点分析一下卡顿的原理和解决的措施.

本节可能用到的秘籍Demo

一、界面卡顿

通常来说,计算机中的显示过程是下面这样的,通过CPUGPU显示器协同工作来将图片显示到屏幕上

最开始时,FrameBuffer只有一个,这种情况下FrameBuffer的读取和刷新有很大的效率问题,为了解决这个问题,引入了双缓存区.即双缓冲机制.在这种情况下,GPU会预先渲染好一帧放入FrameBuffer,让视频控制器读取,当下一帧渲染好后,GPU会直接将视频控制器的指针指向第二个FrameBuffer.

双缓存机制虽然解决了效率问题,但是随之而言的是新的问题,当视频控制器还未读取完成时,例如屏幕内容刚显示一半,GPU将新的一帧内容提交到FrameBuffer,并将两个FrameBuffer进行交换后,视频控制器就会将新的一帧数据的下半段显示到屏幕上,造成屏幕撕裂现象.

为了解决这个问题,采用了垂直同步信号机制.当开启垂直同步后,GPU会等待显示器的VSync信号发出后,才进行新的一帧渲染和FrameBuffer更新.而目前iOS设备中采用的正是双缓存区+VSync.

屏幕卡顿原因

下面我们来说说,屏幕卡顿的原因.

VSync信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 AppApp 主线程开始在CPU中计算显示内容.随后 CPU 会将计算好的内容提交到 GPU 去,由GPU进行变换、合成、渲染.随后 GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上.由于垂直同步的机制,如果在一个 VSync 时间内,CPU 或者 GPU 没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时显示屏会保留之前的内容不变.所以可以简单理解掉帧过时不候.

如下图所示,是一个显示过程,第1帧在VSync到来前,处理完成,正常显示,第2帧在VSync到来后,仍在处理中,此时屏幕不刷新,依旧显示第1帧,此时就出现了掉帧情况,渲染时就会出现明显的卡顿现象.

从图中可以看出,CPUGPU不论是哪个阻碍了显示流程,都会造成掉帧现象,所以为了给用户提供更好的体验,在开发中,我们需要进行卡顿检测以及相应的优化.

二、卡顿监控

卡顿监控的方案一般有两种:

FPS监控

FPS的监控,参照YYKit中的YYFPSLabel,主要是通过CADisplayLink实现.借助link的时间差,来计算一次刷新所需的时间,然后通过 刷新次数 / 时间差 得到刷新频次,并判断是否其范围,通过显示不同的文字颜色来表示卡顿严重程度.如果只是简单的监测,使用FPS足够了.

主线程卡顿监控

除了FPS,还可以通过RunLoop来监控,因为卡顿的是事务,而事务是交由主线程RunLoop处理的.

实现思路:检测主线程每次执行消息循环的时间,当这个时间大于规定的阈值时,就记为发生了一次卡顿.这个也是微信卡顿三方matrix的原理.

卡顿检测三方库:

三、界面优化

CPU层面的优化

GPU层面优化

相对于CPU而言,GPU主要是接收CPU提交的纹理+顶点,经过一系列transform,最终混合并渲染,输出到屏幕上.

提示

上述这些优化方式的落地实现,需要根据自身项目进行评估,合理的使用进行优化

写在后面

和谐学习,不急不躁.我还是我,颜色不一样的烟火.

上一篇下一篇

猜你喜欢

热点阅读