2

我是一个初学者,我想知道图片、视频、窗口和按钮等如何在屏幕上以视觉方式呈现。我不是在问它是由例如 gtk 还是 wxwidgets 制成的,我的问题是使像素以它们的方式出现的基本思想是什么。GUI 库到底是用什么把它们放在屏幕上的?

4

4 回答 4

3

在最基本的情况下,操作系统公开了一组基本绘图 api(gdi、directx、gdi+、opengl),然后调用显示驱动程序并随后更新“视频内存”。回到 DOS 时代,您可以手动更新它,但由于存在大量硬件系统,这变得越来越困难,因此您指示视频驱动程序为您完成。

现在,一旦它在视频内存中,信息就会按顺序发送到您的显示器,逐行扫描(逐行读取)。如果在将视频内存上传到显示器时更新视频内存,则会出现所谓的撕裂(游戏中的垂直同步设置避免了这种情况)。

为避免在此上传过程中撕裂和锁定显存,通常使用一种称为双缓冲的技术,您的显卡上实际上有两个“显存”缓冲区,当您完成上传到其中一个并开始显示器扫描后, card 上传第一个缓冲区并让您将新信息写入第二个缓冲区,从而使过程并行化。

注意:这是关于它的 2D 部分,因为这似乎是您要问的。3D 部分是类似的,但它有一个额外的层,一旦你将顶点传递给你的显示驱动程序,它就会将它们投影到“屏幕空间”中,并逐个扫描线将它们上传到视频内存中,然后再上传到你的监视器。

于 2009-12-15T09:15:24.607 回答
1

阅读 Wikipedia 关于光栅图形的条目,它涵盖了基础知识。

于 2009-12-15T09:11:07.313 回答
0

最后一个问题的简短回答:GUI 库调用操作系统函数来绘制 UI 元素,然后调用相应的显示硬件驱动程序。驱动程序通过写入其外部可访问端口向硬件发送命令,这些端口映射到计算机内存或 I/O 区域上的特殊区域(请参阅Wikipedia 上的设备驱动程序)。

于 2009-12-15T09:11:30.750 回答
0

概述

通常,原始形式的像素数据分组称为帧缓冲区。这是一个大小相同的一维数组。每个值的大小取决于使用的颜色空间颜色深度。例如,一个 32 位 RGBA 帧缓冲区可以像这样在 C: 中定义unsigned int fb[width*height];, given that sizeof int is 4

硬件通常将 RGB 颜色空间用于 OpenGL 和 DirectX 等硬件图形,并使用 Linux 上的 /dev/fb 和 Windows 上的 GDI+ 等直接帧缓冲区访问。电影的硬件解码通常依赖于 YCbCr 颜色空间。一些图像文件格式也将它们的数据保存在 RGB 以外的其他颜色空间中,但会作为 RGB 转换为它们使用的 API。

像素颜色

假设 RGB 颜色空间,单个像素的颜色可以通过这些方式表示(列表不完整):

分离颜色通道(真彩色)

真彩色是三个或四个颜色通道中的每一个的一个分量,其中单独的颜色通道值表示每种颜色的强度。如果它有一个 alpha 通道,它的工作方式相同,但 alpha 的含义取决于上下文。通常 alpha 表示不透明度,其中最小值为 100% 半透明,最大值为 100% 不透明。例如:(0,255,0,128) 表示 50% 半透明绿色,给定 RGBA 真彩色,每个通道使用 8 位颜色深度。

调色板

对于调色板,单个像素值是颜色数组的索引,通常是真彩色(虽然并不意味着每个通道 8 位)。索引的范围是可以表示的颜色数量。8 位调色板索引在以前很常见,尤其是在 1990 年代初期的商品 VGA 硬件上。然后,硬件可以一次显示 256 种颜色的子集,从 2^24 种颜色的池中。

色彩空间

我不想让这个答案太长,而且我认为维基百科的回答比我好,所以这里有一个链接:维基百科:色彩空间 色彩空间是表示颜色和颜色组合的方法。

我应该为我的应用选择哪种色彩空间?

这取决于应用程序如何处理像素数据。不同的色彩空间定义了不同的需求。YCbCr 被运动图像使用,因为它定义了伽马级别,例如 NTSC 和 PAL 标准也定义了伽马级别。sRGB做同样的事情,仅适用于计算机显示器,您可以在其中为特定屏幕选择伽马/颜色配置文件。当您在屏幕上感知到的颜色与在最终介质上感知到的颜色非常接近时,这些颜色空间非常方便。当伽玛不重要并且计算机屏幕是最终媒介时,通常会使用 RGB。它很容易使用,因为颜色空间是线性的。因此,对于计算机游戏,您可能会使用 RGB,但对于像 Photoshop 或 GIMP 这样的图像处理程序,您将支持 HSV/HSL/sRGB 和 CMYK。在使用 API 返回的帧缓冲区中的原始像素时,您可以假定为 RGB,除非您另有说明。处理动态图片时,假设为 YCbCr。硬件支持许多不同的数据编码方式。

于 2009-12-15T09:44:28.917 回答