iOS图像撕裂及解决方法
2020-07-11 本文已影响0人
AcmenL
一、什么是图像撕裂?
就是一张图片在显示的时候出现断层情况,如图所示
图片断层二、为什么会出现图像撕裂?
屏幕成像过程
GPU进⾏渲染->帧缓存区⾥ ->视频控制器->读取帧缓存区信息(位图) -> 数模转化(数字信号处->模 拟型号) ->(逐⾏扫描)显示。
- 将需要显示的图像,经由GPU渲染
- 将渲染后的结果,存储到帧缓存区,帧缓存区中存储的格式是位图
- 由视屏控制器从帧缓存区中读取位图,交由显示器,从左上角逐行扫描进行显示
图像撕裂的前提
CPU以及GPU计算能力跟不上你的帧率(60FPS);才有可能发生撕裂。
原因
当第一帧图像扫描到某个位置时,GPU拿到新的数据并存到帧缓冲区,这个时候视频控制器从帧缓冲区扫描的是新拿到的一帧的图像,最后就形成了在我们肉眼看到的断层现象,究其原因就是视频控制器显示速度大于了GPU处理图形的速度
三、怎么解决图像撕裂
苹果官方针对屏幕撕裂现象,目前一直采用的是 垂直同步+双缓存,只能治标不能之本,而且会带来掉帧问题。
1.垂直同步
垂直同步:垂直同步就是加锁,在当前读取的帧数据结束之前,不会读取下一帧的数据
2.双缓冲区
双缓冲区:采用两个帧缓冲区用途GPU处理结果的存储,当屏幕显示其中一个缓存区内容时,另一个缓冲区继续等待下一个缓冲结果,两个缓冲区依次进行交替
掉帧/卡顿是如何生成的
什么是掉帧?简单来说就是 屏幕重复显示同一帧数据的情况就是掉帧
2.png当前屏幕显示的是A,在收到垂直信号后,CPU和GPU处理的B还没有准备好,此时,屏幕显示的仍然是A
解决办法:
在双缓冲区的基础上再加一个缓冲区,即三缓冲区。