截图是如何工作的?

Eri*_*ing 12 screenshot

我目前正在写一篇关于游戏内摄影的试卷,为此我希望(简要地)指出相机和截图之间的区别 - 但我对后者的技术方面了解得不够多如此称职。我希望你们中的一些人可能知道?

换句话说,截图是如何工作的?它会“冻结”像素吗?是显卡还是它的驱动程序在工作?其他一些硬件或软件组件?

在摄影中,光线被传感器捕获,计算机反而通过屏幕发射光线 - 但我认为屏幕截图本身发生在数据变成像素之前?

use*_*686 16

但我认为屏幕截图本身发生在数据变成像素之前?

它发生在数据变成物理像素(如果有的话)之前,但它发生在数据变成像素值之后,即位图图像。

例如,如果一个程序正在显示文本或矢量图形或 3D 视觉效果,屏幕截图过程根本不关心这些,它只关心这些图形被渲染成位图后的结果图像。

然而,屏幕截图是直接从操作系统内存中截取的,或者最坏的情况是从 GPU 内存中回读——它不是从实际的 VGA 或 HDMI 信号中捕获的。

换句话说,截图是如何工作的?它会“冻结”像素吗?是显卡还是它的驱动程序在工作?其他一些硬件或软件组件?

取决于您要询问的操作系统。通常,核心图形系统(让应用程序在屏幕上放置窗口的同一个系统,例如 Windows 上的 GDI 或 Linux 上的 X11)将在内存中保留屏幕上所有像素的副本(即帧缓冲区),以便它们可以需要时再次发送到 GPU。所以它只是为程序提供了检索该副本的功能。

例如,在 Windows 上有GetDC()GetWindowDC()函数。在 Linux 上,X11 系统有一些类似的方法,例如XGetImage()。这些只是为程序提供了一个位图图像,该图像已经保存在系统 RAM 的某处,无需任何特殊的硬件参与。

(尽管在某些情况下,例如在 Linux 上的 GNOME,窗口管理器实际上使用 GPU 来组合屏幕内容——因此为了制作屏幕截图,它实际上必须首先将数据请求回 CPU。)


作为旁注,帧缓冲区中的内容与实际显示的内容之间可能存在一些差异。例如,许多视频游戏会产生非常暗的屏幕截图,因为它们使用 GPU 的伽马校正功能来调整图像亮度,而这种校正仅作为生成视频信号时的最后一步应用——因此屏幕截图只会捕获未校正的、暗的-看起来像。(除非游戏实际上用自己的方式覆盖了整个操作系统截图功能。)