今天带大家来了解一下图像的渲染原理,我想很多人在某个时间点都可能好奇过,电脑手机为什么能展示相应的图片视频,它们内部到底干了哪些事,带着这些疑问,下面让我们一步步来了解一下图像的渲染原理
如果想要了解这些问题,我们首先要了解一些基础概念
显示器:
很显然显示器就是用来显示内容的,就是我们肉眼所能直接观察到的,显示器上我们可以看到一些图像视频,那这些图像它们来自于哪里,不要着急,带着疑问我们继续向下看
视频控制器:
控制刷新部件,负责将帧缓冲区图片信息(即位图)读取处理过后交给显示器显示,帧缓冲区和显示器对应关系
帧缓冲区:
存储着一些即将展示图片的信息,如颜色值等.
CPU和GPU区别
CPU ---> 运算核心/控制核心(处理逻辑复杂的任务,例如数据类型的处理,依赖性非常高,所谓的并发只是时间片之间的切换)
GPU ---> 绘图运算的微处理器(很多的计算单元,可以实现高并发,依赖性比较低)
渲染流程
GPU进行渲染 ---> 帧缓冲区里 ---> 视频播放器 ---> 读取帧缓冲区里面的信息(位图 ) ---> 数模转换(数字信号处 ---> 模拟信号) ---> (逐行扫描)显示
当GPU的速度和视频控制器的速度保持一致,每扫描一张图片就显示一张图片,这样看是不会出什么问题的,但是由于视频播放器是一边扫描一遍读取,而不是等待一张图片完全扫描完成以后才去读取,当GPU的速度大于视频播放器的速度的时候就会造成GPU从帧缓冲区里拿到的图片信息不是来自于同一张图片,这样就造成了一个很严重的问题"撕裂"
为了解决这个问题,苹果采用了以下方案
垂直同步Vsync + 双缓冲区 DoubleBuffering
垂直同步Vsync:
帧缓存区加锁 防⽌出现撕裂情况 ,会出现掉帧
双缓存区 DoubleBuffering :
就是GPU开辟AB两个帧缓冲区,当A缓冲区拿到第一帧数据的时候加锁,视频控制器开始从A缓冲拿数据并逐行扫描完成,当扫描完成的时候在指向第二个缓冲区,在两个缓冲区来回切换,这样就保证了GPU拿到的信息来自于同一张图片
但是当这样还会存在一个问题就是掉帧,为了减少掉帧的频率苹果采用了三缓冲区
->新的问题接收 Vsync,cpu/gpu图片数据(速度问题)->拿不到 Framebuffer->掉帧(重复渲染同一帧数据)
三缓存区:
(充分利用CPU/GPU闲置时间,A显示屏幕, B也渲染好,C再从GPU拿取渲染数据.)三缓存并不能从根本上解决掉帧的情况,但是比二级缓存的方案更优,比二级缓存多了一个步骤.
总结
屏幕卡顿原因
1.CPU/GPU渲染流水线耗时过长ー>掉帧
2.垂直同步 Vsync+双缓存区 Double Buffering以掉帧作为代价=>屏幕撕裂
3.三缓存区:合理使用CPU/GPU減少掉帧次数;
网友评论