本文是一些个人的理解,欢迎大家批评指正,一起交流!
屏幕图像的显示原理
屏幕图像的显示原理要从CRT(阴极射线显像管)显示器说起,CRT显示器是靠电子束激发屏幕内表面的荧光粉来显示图像的,CRT的电子枪从上到下逐行扫描,扫描完成后就呈现一幅图像。然后电子枪在回到开始的位置进行下一次扫描。为了同步显示器的显示过程和视频控制器的控制过程,显示器会用硬件时钟产生一系列的定时信号,当电子枪换行进行扫描的时候,会发出一个水平同步信号,简称HSync,当一幅画面从上到下绘制完成后,电子枪恢复到开始位置,准备画下一帧前,会发出一个垂直同步信号,简称VSync。显示器都有刷新频率,这个刷新率就是VSync信号产生的频率。
图像显示的过程
图像显示各个部分的分工如下所示
CPU拿到位图数据 ,然后通过总线发送给GPU,GPU做图层渲染,然后将渲染的结果保存在帧缓冲区(FrameBuffer)里面,在由视图控制器根据VSync信号在适应的时机将帧缓冲区里面的内容给到显示器。
双缓冲绘图
最简单的情况下,帧缓冲区只有一个,那么这个时候帧缓冲区的读取和刷新都会有很大的效率问题,为了解决效率问题,通常会引入两个缓冲区,这个时候一个缓冲区用于视频控制器的读取,被称为前缓冲区,另外一个缓冲区用于数据的存放,称为后缓冲区,等每次渲染完毕之后,前缓冲区变后缓冲区,后缓冲区变前缓冲区。这里用一幅别人的图
画面撕裂产生的原因
双缓冲绘图机制同样也带了一个问题,就是画面的撕裂,当前缓冲区里面的一帧数据没有渲染完毕的时候,这个时候后缓冲区满了,这个时候交换两个缓冲区,这个时候视频控制器就会把新的一帧数据的其他部分显示到屏幕上,造成画面撕裂。
解决办法:VSync同步机制,只有在VSync信号发出以后,才会进行前后缓冲区的交换。
渲染的几种方式
GPU渲染
CPU将位图数据发送给GPU,GPU做图层渲染
CPU渲染
CPU直接做图层渲染,然后将渲染数据保存到帧缓冲区里面
离屏渲染
离屏渲染也属于GPU渲染,GPU渲染有下面两种方式
1、On-Screen Rendering
当前屏幕渲染,指的是GPU的渲染操作在当前用于显示的屏幕缓冲区中进行,但是有一些操作是没有办法进行的,比如光栅化,抗锯齿等。
2、Off-Screen Rendering
离屏渲染,GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作,离屏渲染的代价是比较高的,首先我们要创建一个渲染缓冲区,整个渲染过程需要切换上下文环境,首先会从当前屏幕切换到离屏,等待离屏渲染结束后,将离屏缓冲区的渲染结果显示到屏幕上,这个时候又要将上下文环境切换回来。
问题
有一个不太理解的点是双缓冲和离屏渲染的区别是什么?
我自己的理解:双缓冲是在帧缓冲区,帧缓冲区存放的是渲染的结果。离屏渲染是多创建一个渲染缓冲区,所有我的理解是离屏渲染完毕后将渲染结果放入到帧缓冲区里面,离屏渲染在帧缓冲之前。
参考资源
来源:CSDN
作者:浅抿0110
链接:https://blog.csdn.net/yp18792574062/article/details/104010455