计算机渲染的那些事

大兔子大兔子 提交于 2020-01-25 11:14:25

本文是一些个人的理解,欢迎大家批评指正,一起交流!

屏幕图像的显示原理

屏幕图像的显示原理要从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在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作,离屏渲染的代价是比较高的,首先我们要创建一个渲染缓冲区,整个渲染过程需要切换上下文环境,首先会从当前屏幕切换到离屏,等待离屏渲染结束后,将离屏缓冲区的渲染结果显示到屏幕上,这个时候又要将上下文环境切换回来。

问题

有一个不太理解的点是双缓冲和离屏渲染的区别是什么?

我自己的理解:双缓冲是在帧缓冲区,帧缓冲区存放的是渲染的结果。离屏渲染是多创建一个渲染缓冲区,所有我的理解是离屏渲染完毕后将渲染结果放入到帧缓冲区里面,离屏渲染在帧缓冲之前。

参考资源

iOS图形原理与离屏渲染

图形图像渲染原理

iOS离屏渲染详解

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!