美文网首页
iOS图像渲染流程及卡顿的原因

iOS图像渲染流程及卡顿的原因

作者: 天涯寻梦人 | 来源:发表于2020-07-05 21:35 被阅读0次

    今天带大家来了解一下图像的渲染原理,我想很多人在某个时间点都可能好奇过,电脑手机为什么能展示相应的图片视频,它们内部到底干了哪些事,带着这些疑问,下面让我们一步步来了解一下图像的渲染原理

    如果想要了解这些问题,我们首先要了解一些基础概念

    显示器:

    很显然显示器就是用来显示内容的,就是我们肉眼所能直接观察到的,显示器上我们可以看到一些图像视频,那这些图像它们来自于哪里,不要着急,带着疑问我们继续向下看

    视频控制器:

    控制刷新部件,负责将帧缓冲区图片信息(即位图)读取处理过后交给显示器显示,帧缓冲区和显示器对应关系

    帧缓冲区:

    存储着一些即将展示图片的信息,如颜色值等.

    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減少掉帧次数;

    相关文章

      网友评论

          本文标题:iOS图像渲染流程及卡顿的原因

          本文链接:https://www.haomeiwen.com/subject/cqyvqktx.html