画面撕裂
了解画面撕裂之前,需要先了解显示的原理
- 显示原理:显示器显示图像前,位图信息会被提前存储在帧缓冲区里,再由显示控制器从帧缓冲区读取数据,进行数模转化(数字信号处理为模拟信号),再由显示控制器,逐行扫描并显示。
- 撕裂原因:CPU/显卡完成图形计算,在GPU渲染时,每渲染一帧就存放到帧缓冲区,当渲染频率和刷新频率不一致时,显示刷新频率(固定频率,一般为60HZ,16ms一次)跟不上GPU的渲染频率,上一帧已经渲染完毕,但显示器却未及时显示,这个频率的不统一就会造成画面撕裂。
解决方案:垂直同步信号+三重缓冲区;
- 1.显示器每刷新一帧就发送垂直同步Vsync,向缓冲区获得数据再显示,使得渲染频率和刷新频率一致。
- 2.三重帧缓冲区组成了一个前缓冲区,两个后缓冲区的规格。程序来回向两个后缓冲区写入图像,每次显示器刷新时,前缓冲区就和最近完成写入的那个后缓冲区交换。即便有一个缓冲区要等待垂直同步信号,另外两个缓冲区还是可以来回写入图像。
注意:Android使用的是三重缓冲区+垂直同步信号;iOS使用的是双重缓冲区+垂直同步,苹果将CPU和GPU的计算能力优化到频率相一致,所以在Apple设备上也非常少的出现撕裂现象。
三重帧缓冲区之前还有双重帧缓冲区,双重缓冲区机制是,在GPU预先渲染一帧画面存入一个缓冲区内,以便视频控制器从缓冲区中读取并显示,当GPU将下一帧渲染好,GPU会直接让视频控制器从第二个缓冲区读取数据再显示。这就提高了效率也解决了画面撕裂,但同时出现了新问题,掉帧(延迟)现象。双重缓冲机制为了将帧缓存交换的时间和显示器刷新时间保持同步,帧缓存中的画面将会延后一个刷新周期被显示出来。所以引入三重缓冲区+垂直同步技术方案。
补充CPU和GPU各自特性
CPU:是运算核心,控制中枢;逻辑复杂,数据处理庞大;依赖性非常高,并发和时间片切换执行;
GPU:绘图运算的微处理器;GLSL语言就比较简单且执行快捷,处理逻辑少;计算单元能高并发,依耐性非常低;
网友评论