我一直在尝试了解显示和图形。我觉得很难对这些术语做出合乎逻辑的描述。我了解这一点:


帧缓冲区是专用的内存,具有以像素格式显示的图像/视频/ 3dimage或视频。
覆盖层是某种硬件与帧缓冲区一起使用。
Surfaceflinger是合成管理器。它从GPU提取渲染的数据,然后将它们合成到一个表面中。这就是说,它使用底层硬件和驱动程序来完成所有这些合成。
合成意味着混合,混合所有表面。
覆盖,平面,帧缓冲区和子画面?这一切是做什么的,或者如何将它们结合起来并理解?

任何书籍,链接将不胜感激。很多书都以图形方式进行介绍,而不是采用一个特定的SoC先解释显示,然后详细解释图形。

#1 楼

如您所知,帧缓冲区是内存中的一个数组,其中包含要在屏幕上显示的所有像素。在台式机上,它可能是图形卡上的特殊内存,但在具有GPU和CPU共享一个内存的SoC中,它可能是显示控制器使用DMA读取的常规内存分配。

显示控制器是一种硬件,可以从帧缓冲区读取像素并将其显示在物理屏幕上。

许多显示控制器都支持使用覆盖,这就像一个非常简单的窗口。有时它们是固定大小的,但有时却被掩盖了。在这种情况下,可能会有一个辅助帧缓冲区覆盖整个屏幕。当显示控制器从主帧缓冲区中读取特定颜色的像素时,它不显示该像素,而是从辅助帧缓冲区中替换相应的像素。这就像电影效果和天气预报中使用的色度键或绿屏技术一样。

这是一种特殊的配置:辅助帧缓冲区有时比主帧缓冲区小得多,并且显示控制器中有特定的寄存器控制尺寸和偏移。

覆盖技术通常用于显示视频流。视频帧可能来自相机硬件或视频解码器硬件。使用覆盖层意味着该硬件和产生屏幕其余部分(例如相机或回放GUI)的GPU不会立即尝试访问同一内存。覆盖层的像素格式也可能与主帧缓冲区不同。

覆盖技术仅允许您执行此简单替换,尽管(可能需要一些缩放),但没有任何复杂的方法。在不同应用程序之间切换时,不能使视频帧旋转并缩小为图标。您不能将视频与主帧缓冲区进行Alpha混合。另外,叠加层的数量受硬件限制:通常为一个,但是某些控制器支持两个。

在此上下文中的组合是指窗口管理器执行的操作。它从屏幕上的每个应用程序获取帧(系统GUI也是一个应用程序),并生成最终帧。在智能手机上,这通常意味着仅使用当前的前台应用程序和系统GUI(通知栏和导航栏)并将它们彼此相邻绘制。但是,当应用程序之间存在转换时,或者如果您使用“最近的任务”按钮,情况将更加复杂。该合成器还必须处理编排应用程序,以便即使应用程序以不同的速率绘制,屏幕也可以60 Hz更新。

Surface Flinger是Android的合成器。它使用OpenGL ES来完成上一段中描述的操作。它还负责为要渲染到的每个应用程序创建一个帧缓冲区。 (使用EGLImage,这些帧缓冲区在Surface Flinger中显示为纹理。)

Android还可以检测手机上的显示控制器可以作为叠加层处理的简单情况,以便可以切换到使用叠加层而不是使用Surface Flinger基于GLES的完整合成的更快,更节能的途径。

评论


$ \ begingroup $
是否有所有这些组件协同工作的图像或图片?
$ \ endgroup $
–mrigendra
17年6月23日在4:02

$ \ begingroup $
@mrigendra您的Android手机上显示的每一帧都显示这些组件协同工作!认真地说,如果您要说的是图表,我不知道。
$ \ endgroup $
–丹·赫尔姆
17年6月23日在8:22