敲黑板,划重点!!!
图片撕裂:两帧或多帧图片在屏幕上显示,导致显示效果错位,效果图如下:
掉帧:指的是重复显示同一帧图片,非丢失了某一帧内容(有疑问,见思考)
图片撕裂流程图如下:
为解决上述问题:iOS引入垂直同步Vsync + 双缓存区 DoubleBuffering
1、垂直同步Vsync:即加锁原理,当前帧内容没有显示完全时,不会读取下一帧内容,帧缓存区被锁定
2、双缓存区 DoubleBuffering :即在GPU开辟两个帧缓冲区
上述技术解决图片撕裂问题的同时引入了掉帧的问题
如上图,当CPU+GPU处理图片的是时间>每一帧显示的时间(16.7ms)(1s中显示60帧,人视觉感官会更加流畅和逼真)时,帧缓存区无更新,继续显示当前帧内容
为了解决上述问题:iOS引入了三级缓存技术,需要关注的是,该技术仅仅只是解决了掉帧出现的概率,没有从根本上解决掉帧的问题
思考(问题):
当前显示A缓存区数据,Vsync信号接受时,B缓存区帧数据未更新,那应该是显示当前帧的上一帧数据而不是同一帧数据,是B缓存区数据未更新时,即使A缓存区数据显示完成,屏幕控制器也不会指向B帧缓冲区吗?
解答:掉帧时,还是显示的当前帧数据,由于B缓存数据未更新,不会去读B缓存区的数据