如何将数据直接写入显存?

How to write data directly into video memory?

程序员有没有办法直接把数据写入显存?我知道 OS 对此非常严格,但是某些类型的应用程序(如视频播放器或电脑游戏)如何将其数据直接写入视频内存。

我知道有很多著名的库(例如 OpenGL);但它们毕竟只是普通的库,和你我写的程序没有本质区别

I know there are a bunch of well-known libraries for this (e.g. OpenGL); but they are just normal libraries after all and there's no fundamental difference between them and the programs that me and you write.

哦,它们与"normal libraries"完全不同。

以OpenGL为例。其中一部分是您加载的 DLL 或 SO。但其中一部分是所谓的 "driver" 或 "graphics driver"。那根本不是 "normal library";它基本上是操作系统的一部分。它基本上是 OS 的一部分,是 OS 作者以外的人写的。

系统为驱动程序定义接口,硬件制造商提供适合该接口的驱动程序库。但这不是普通用户能够提供的,大多数游戏也无法通过安装自己的图形驱动程序 运行。

驱动程序的目的是为 OS 和 OS 的客户端提供统一的图形硬件接口。不同的硬件是不同的,但是 OS 的每个驱动程序都导出相同的接口(或多或少),这使得客户端代码不必知道硬件的细节。

防止客户端代码破坏系统。如果您使 GPU 崩溃(由于它是处理器,现在您可以做这件事),就必须有人来处理。 OS 处理 CPU 故障,现在的图形 driver/OS 也处理 GPU 故障。但为了做到这一点,它必须站在你和硬件之间。

在大多数操作系统上,直接任意访问显存是不允许的。不适用于任何本身不是图形驱动程序的程序。许多低级 API(如 OpenGL)允许您映射某些内存分配,以便您可以访问它们。但这与仅仅给某人一个 GPU 内存指针有很大的不同。毕竟,无法保证映射指针实际指向 GPU 内存。

哦,他们不允许您映射纹理或帧缓冲区,因为他们希望保留实现定义的硬件纹理格式的细节。