
卡顿: 指用户在使用过程中出现了一段时间的阻塞,使得用户在这一段时间内无法进行操作,屏幕上的内容也没有任何的变化。
卡顿作为App的重要性能指标,不仅影响着用户体验,更关系到用户留存、DAU等重要产品数据。因此,需要关注APP的卡顿
首先,屏幕上看到的所有内容都是计算机绘制出来的图像
帧率:Frames Per Second(fps),表示每秒渲染帧数,
通常用于衡量画面的流畅度,每秒帧数越多,则表示画面越流畅。
通常,60fps比较流畅,也就是60张/秒,每张图片需要的渲染时间大约是:
1s/60张 = 1000ms/60张 = 16.7ms/1张
也就是1张图像在16.7ms内出现一次,就不会造成卡顿现象。



卡顿产生的原因:当单位时间内,界面要刷新的时候,CPU或GPU由于计算量大,没有做好准备,
就会造成界面显示前一个时间段的界面,从而造成卡顿、掉帧现象
核心: 减少CPU、GPU的资源消耗
在OpenGL中,GPU有2种渲染方式:
1 当前屏幕渲染:在当前用于显示的屏幕缓冲区进行渲染操作
2 离屏渲染:在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作
帧率:Frames Per Second(fps),表示每秒渲染帧数

使用系统CADisplayLink监控,CADisplayLink是一个与屏幕刷新率相同的定时器,大约1/60s调用一次。
将其注册到RunLoop里面,计算当前画面的帧数。
delta为时间差等于1

由于UI刷新只能在主线程操作,因此,平时所说的“卡顿”,主要是因为主线程执行了比较耗时的操作
因此,可以添加observer到主线程Runloop中,通过监听Runloop状态切换的耗时,以达到监控卡顿的目的

RunLoop在BeforeSources和AfterWaiting后会进行任务的处理。可以在此时阻塞监控线程并设置超时时间,若超时后RunLoop的状态仍为RunLoopBeforeSources或AfterWaiting,表明此时RunLoop仍然在处理任务,主线程发生了卡顿

ping是常用的网络测试工具,用来测试数据包能否到达ip地址。

ping主线程的核心思想是向主线程发送一个信号,一定时间内收到了主线程的回复,即表示当前主线程流畅运行。
没有收到主线程的回复,即表示当前主线程在做耗时运算,发生了卡顿。
子线程Ping主线程的实现思路:
相当于:
子线程设置一个标识YES
如果发生了主线程的卡顿,那么到规定时间,主线程内的代码没有执行,则标识还是YES,这时候,代表卡顿
如果没有发生卡顿,那么到规定时间,主线程内的代码执行,则表示变为NO,这时候,代表没有发生卡顿

