程序员有没有办法直接将数据写入显存?我知道操作系统对此非常严格,但是某些类型的应用程序(如视频播放器或电脑游戏)如何可以将其数据直接写入视频内存。
我知道有很多知名的库(例如 OpenGL);但它们毕竟只是普通的库,它们和我和你写的程序没有根本区别。
我知道有很多知名的库(例如 OpenGL);但它们毕竟只是普通的库,它们和我和你写的程序没有根本区别。
哦,它们与“普通图书馆”相当不同。
以OpenGL为例。其中一部分是您加载的 DLL 或 SO。但其中一部分是所谓的“驱动程序”或“图形驱动程序”。那根本不是一个“普通的图书馆”;它是一个图书馆。它从根本上来说是操作系统的一部分。它基本上是操作系统制造商以外的人编写的操作系统的一部分。
系统定义驱动程序的接口,硬件制造商提供适合该接口的驱动程序库。但这不是普通用户能够提供的,大多数游戏也不是通过安装自己的显卡驱动程序来运行的。
驱动程序的目的是为操作系统和操作系统客户端提供图形硬件的统一接口。不同的硬件是不同的,但是操作系统的每个驱动程序都会导出相同的接口(或多或少),这使得客户端代码不必了解硬件的详细信息。
这也可以防止客户端代码破坏系统。如果你的 GPU 崩溃了(因为它是处理器,现在你可以这样做),就必须有人来处理这个问题。操作系统处理 CPU 故障,现在的图形驱动程序/操作系统也处理 GPU 故障。但要做到这一点,它必须介于您和硬件之间。
在大多数操作系统上,不允许直接和任意访问视频内存。不适用于本身不是图形驱动程序的任何程序。许多低级 API(例如 OpenGL)允许您映射某些内存分配,以便您可以访问它们。但这与仅仅给某人一个 GPU 内存指针有很大不同。毕竟,无法保证映射的指针实际上指向 GPU 内存。
哦,他们不允许您映射纹理或帧缓冲区,因为他们希望保留实现定义的硬件纹理格式的细节。
如果您在大多数操作系统上直接尝试写入视频内存,它只会给您带来分段错误,因为应用程序默认在用户模式下运行,但也许 kerenl 模式驱动程序可以直接写入视频内存