【问题标题】:How to write data directly into video memory?如何将数据直接写入显存?
【发布时间】:2023-03-13 07:44:02
【问题描述】:

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

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

【问题讨论】:

  • 在某些 ARM 板上,您可以通过文件 /dev/fb0 直接访问帧缓冲区。带有开源驱动程序的现代 Linux 系统允许您通过 libdrm & co 访问视频内存。
  • 确实有一个根本的区别:它们带有自己的驱动程序 / 内核模块

标签: operating-system video-processing computer-architecture


【解决方案1】:

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

哦,它们与“普通库”相当不同。

以 OpenGL 为例。其中一部分是您加载的 DLL 或 SO。但其中一部分是称为“驱动程序”或“图形驱动程序”的东西。那根本不是“普通图书馆”。它基本上是操作系统的一部分。它基本上是操作系统制造商以外的人编写的操作系统的一部分。

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

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

防止客户端代码破坏系统。如果您使 GPU 崩溃(由于它是处理器,现在您可以这样做),则必须有人处理。操作系统处理 CPU 故障,而现在的图形驱动程序/操作系统也处理 GPU 故障。但为了做到这一点,它必须介于你和硬件之间。

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

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

【讨论】:

  • 我相信你应该把更多的重点放在答案的最后部分:问题是没有访问内存(任何驱动程序都可以),问题是硬件接口复杂。有多种缓冲区(着色器、纹理、帧缓冲区……)、GART、视频模式以及最后但并非最不重要的事实,即“显示器”是共享资源,只要操作系统需要刷新,它将覆盖帧缓冲区。
  • 感谢您的迷你综合回复 ;-) 但请告诉我是否正确地说“如果显卡制造商想要真正支持 OpenGL,它必须提供与 OpenGL 兼容的驱动程序(运行 OpenGL 命令的驱动程序)”。最后一件事:我仍然不知道程序员可以使用哪些 API(其中有多少个)来完成神奇的图形工作。我猜每个单独的操作系统都有自己完成该任务的方式,对吧?例如,据我所知,Windows 有 DirectX。其他操作系统呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2023-03-24
  • 2020-03-25
  • 2018-03-18
  • 2018-04-15
相关资源
最近更新 更多