-3

我是编程新手。我确实知道 C/C++ 和 Win32 的基础知识。我现在正在尝试做图形,但我想要最快的屏幕连接。我意识到大多数人都在使用 Opengl 或 DirectX。但是,我不想要开销。我想从头开始并控制像素数据。我知道 GDI 位图,但我不确定这是否是访问数据的最佳方式。我知道我必须通过窗户交谈,这很麻烦。Opengl 和 DirectX 是否编译到 GDI 的级别,或者他们有什么特殊的方法,他们是绕过还是使用类似的代码?请不要问我为什么要这样做。也许对如何做到这一点的解释可能会有所帮助。就像 windows 如何组合所有窗口以创建最终图像一样。

4

3 回答 3

7

对像素数据最直接的访问是通过OpenGL 和 Direct3D 都支持的着色器。它们经过交叉编译并直接在视频卡上运行。他们不使用 OpenGL,他们没有 OpenGL 开销。OpenGL 最初只是用来将它们送到显卡自己的处理器上。

您在 CPU 上所做的任何事情都必须首先通过总线(通常是 PCI-express)复制到视频卡。GDI 实际上是从图形内存中删除了许多级别。

OpenGL、Direct3D、Direct2D、GDI 和 GDI+ 都是抽象层。GPU 供应商编写了一个接受这些标准命令函数的驱动程序,将数据重新编码为特定于卡的格式,然后将其发送到卡。通常,OpenGL 和 Direct3D 的优化程度最高,并且需要最少的重新编码。

Windows 如何组合各种屏幕窗口以创建全屏图像在很大程度上取决于您所谈论的 Windows 版本。DWM 改变了一切。由于在 Vista 中引入了 DWM,程序渲染到其个人 GPU 内存区域,然后窗口管理器使用视频卡的纹理查找单元将每个程序的单独区域有效地分层到屏幕主缓冲区上。当程序(通常是游戏)请求全屏独占访问时,会跳过此步骤,驱动程序会导致来自该应用程序的渲染命令直接影响主屏幕缓冲区。

假设 CPU 正在生成需要显示的数据,最快和最有效的方法可能是将该数据块复制到顶点缓冲区对象中,并使用 OpenGL 命令将其光栅化为线或多边形或其他任何东西(或Direct3D 等效)。如果您以前认为 GDI 是低级接口,那么您需要阅读一些资料来完成这项工作。但它的运行速度将比纯 GDI 快几个数量级。事实上,新架构的速度要快得多,因为 GDI(和 WPF)建立在 Direct2D 和/或 Direct3D 之上。

于 2012-04-29T18:05:27.903 回答
1

但我想要最快的屏幕连接

我想从头开始控制像素数据

你要求的是不可能的。当您使用 GPU 加速功能时,您将获得最佳性能。但是,在这种情况下,您无法直接访问像素数据,并且尝试访问它(读回或写入)会对性能产生负面影响,因为您必须将数据从系统内存传输到视频内存。因此,应小心处理从系统内存流式传输到视频内存的任何内容。另外,您必须学习 API。

如果你“从头开始”并在 CPU 上进行渲染,则可以轻松访问像素数据并完全控制渲染,但性能会不如 GPU(CPU 不太适合并行处理,系统内存可以比视频内存慢一个数量级),而且您将花费大量时间重新发明轮子。

Opengl 和 DirectX 是否编译到 GDI 的级别,或者他们有什么特殊的方法,他们是绕过还是使用类似的代码?

不,它们几乎直接使用硬件制造商提供的驱动程序与图形硬件通信。并且 DirectX/OpenGL 使用的那些“直接硬件访问”接口将不提供给您——它们是特定于硬件和制造商的,可以是内部的,甚至可能受专利保护。

当然,您可以使用的旧硬件接口很少(即 VESA 或 VGA 13h 模式),但是,操作系统通常禁止直接使用它们(您无法在 Windows 上轻松访问 VESA),因此要访问他们必须启动 MS-DOS、使用自定义操作系统或帮助程序类(例如 linux 上的 SVGAlib),它们可能只能在 root 权限下运行。当然,即使您实际使用 VESA/VGA 自己渲染某些东西,与 OpenGL/DirectX 完成的硬件加速渲染相比,在任何硬件(比 RivaTNT 2 Pro 更新)上的性能都将是可怕的。你有没有见过 windows xp 在没有适当的 GPU 驱动程序时工作的速度有多快(重绘窗口需要一秒钟)?这就是直接 VESA/VGA 访问的速度。

请不要问我为什么要这样做。

问你为什么要这样做是有道理的。您的“我想要直接的低级访问”方法可能适用于 15..20 年前或 DOS 时代。现在合理的解决方案是使用现有的 API(由不是你的人维护)并寻找一种充分利用它的方法。当然,如果你想开发驱动程序,那就另当别论了。

于 2012-04-29T18:30:05.513 回答
0

Opengl 和 DirectX 是否编译到 GDI 的级别,或者他们有什么特殊的方法吗

我意识到大多数人都在使用 Opengl 或 DirectX。但是,我不想要开销

所以你说的是**你完全不知道 OpenGL 或 DirectX 实际做了什么,但你已经确定它们的效率不足以满足你的需求。

对不起,这是胡说八道。回答这样的问题是不可能的。

在现实世界中,您拥有一台专门用于绘图的小型超级计算机。您可以通过 OpenGL 和 DirectX 访问它。

它们速度快的原因是它们只是“从头开始并控制像素数据”。

因此,如果您想要认真的答案,请尝试让那些有知识回答您问题的人决定哪个问题最好。

如果您想要高效的图形,正确的答案是使用 DirectX 或 OpenGL。

于 2012-04-29T18:38:28.860 回答