全栈开发知识库

18.其他

视觉暂留: 人眼在观察景物时,光信号传入大脑神经,需经过一段短暂的时间,光的作用结束后,视觉形象并不立即消失,这种残留的视觉称“后像”,视觉的这一现象则被称为“视觉暂留”。

物体在快速运动时,当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1 ~ 0.4秒左右的图像,所以当图像的刷新帧率高于每秒16帧时,在人眼看来就是不间断的显示。

光栅扫描

光栅扫描显示是目前的主流。

在光栅扫描显示中,电子束横向扫描屏幕,一次一行,从顶到底依次进行。

电子束在屏幕上逐点移动时,从被称为帧缓存的存储区取出每个像素点的强度值控制其显示状态。
这种实现原理决定了光栅扫描显示的刷新频率和图像复杂度无关,刷新频率可以是恒定的。

光栅扫描显示对屏幕上的每个点都有存储强度信息的能力(除颜色信息外,其他的像素信息也存在帧缓存中),从而使得适用于包含阴影和彩色模式的逼真场景。

GPU的渲染流程:

GPU进行渲染时,会把数据先存储在帧缓冲区里,然后视频控制器读取帧缓冲区里的数据,完成数模转化,逐行扫描显示画面。

理论上,完美情况时,每扫描一张图,就显示一张,然后下一张也扫描完成等待刷新。

一次反复,屏幕就会保持流畅,那为什么有时候屏幕还会出现不流畅的现象?

  • 撕裂:

当视频控制器读取完一帧画面显示后,会去帧缓存读取下一帧,如果帧缓存仍然保持着上一帧的数据没有被刷新,视频控制器照常工作读取帧缓存中的数据。

当寄存器工作到某一行时,帧缓存的数据被更新为下一帧,视频控制器就读取到新的数据,而此时已经显示的画面是上一帧的数据,后续将要显示的是下一帧的数据,撕裂也就产生了。

所以,撕裂的产生是因为帧缓存的刷新频率没有跟上屏幕的刷新频率,根本原因就是CPU或GPU工作超时。

为了解决撕裂的问题,会使用垂直同步Vsync + 双缓冲的机制。

在VSync信号到来后,会在CPU中计算显示内容,比如视图的创建、布局计算、图片解码、文本绘制等。

然后CPU会将计算好的数据提交到GPU,由GPU进行变换、合成、渲染。然后GPU会把渲染结果提交到帧缓存,等待下一次VSync信号到来时显示到屏幕上。

由于垂直同步的机制,如果在一个VSync时间内,CPU或者GPU没有完成内容提交,则那一帧就会被丢弃,等待下一次机会再显示,而这时屏幕会刷新显示上一帧的内容。

通过这种机制,就解决了撕裂的问题,但同时引入了新的问题 -- 掉帧。

当CPU或GPU渲染流⽔线耗时过⻓,前后显示同一帧时,也就出现了掉帧现象(所以掉帧不是不渲染数据,而是重复渲染同一帧数据)。

至于掉帧无法被完全解决,因为CPU或GPU的工作是不可预估的。只能尽量合理的使用CPU或GPU减少掉帧次数。

混合

OpenGL ES混合本质上是将2个片元颜色进行调和产生一个新的颜色。

OpenGL ES混合发生在片元通过各项测试之后,准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值