卡顿产生的原因

屏幕撕裂

iOS是双缓冲机制,双缓冲虽然能解决效率问题,但会引入一个新的问题。当视频控制器还未读取完成时,即屏幕内容刚显示一半时,GPU 将新的一帧内容提交到帧缓冲区并把两个缓冲区进行交换后,视频控制器就会把新的一帧数据的下半段显示到屏幕上,造成画面撕裂现象,如下图:


1401554-cab01db100f1d823.png
image.png

针对这个问题,GPU通常会做垂直同步,GPU 会等待显示器的垂直同步信号发出后,才进行新的一帧渲染和缓冲区更新。这样能解决画面撕裂现象,也增加了画面流畅度,但需要消费更多的计算资源,也会带来部分延迟。现在iOS 设备会始终使用双缓存,并开启垂直同步

关于卡顿的简单原理解释:

V-Sync

V-Sync 的主要作用就是保证只有在帧缓冲区中的图像被渲染之后,后备缓冲区中的内容才可以被拷贝到帧缓冲区中,理想情况下的 V-Sync 会按这种方式工作:

1401554-3b102ffdd8635b65.png-1000width
normal-vsyn

每次 V-Sync 发生时,CPU 以及 GPU 都已经完成了对图像的处理以及绘制,显示器可以直接拿到缓冲区中的帧。但是,如果 CPU 或者 GPU 的处理需要的时间较长,就会发生掉帧的问题:

1401554-efa9396b790c5f00.png
image.png

在 V-Sync 信号发出时,CPU 和 GPU 并没有准备好需要渲染的帧,显示器就会继续使用当前帧,这就加剧了屏幕的显示问题,而每秒显示的帧数会少于 60。

由于会发生很多次掉帧,在开启了 V-Sync 后,40 ~ 50 FPS 的渲染频率意味着显示器输出的画面帧率会从 60 FPS 急剧下降到 30 FPS,原因在这里不会解释,读者可以自行思考。

其实到这里关于屏幕渲染的内容就已经差不多结束了,根据 V-Sync 的原理,优化应用性能、提高 App 的 FPS 就可以从两个方面来入手,优化 CPU 以及 GPU 的处理时间。

卡顿解决的主要思路:

尽可能减少CPU、GPU资源的消耗。
按照60FPS的刷帧率,每隔16ms就会有一次VSync信号。

猜你喜欢

转载自blog.csdn.net/weixin_33860528/article/details/90988944
今日推荐