我是编程新手。我知道C / C ++和Win32的基础知识。我现在正在尝试做图形,但我想要最快的连接到屏幕。我意识到大多数人都会使用Opengl或DirectX。但是,我不想要开销。我想从头开始控制像素数据。我知道GDI位图,但我不确定这是否是对数据的最佳访问。我知道我必须通过Windows进行交谈,这就是麻烦。 Opengl和DirectX是否可以编译到GDI级别,或者他们是否采用特殊方式,绕过或使用类似的代码?请不要问我为什么要这样做。也许解释如何做到这一点可能会有所帮助。就像windows结合所有窗口来创建最终图像一样。
答案 0 :(得分:6)
对像素数据的最直接访问是通过着色器,OpenGL和Direct3D都支持。它们是交叉编译的,直接在视频卡上运行。他们不使用OpenGL,他们没有OpenGL开销。首先,OpenGL只是用于将它们连接到显卡自己的处理器。
您在CPU上执行的任何操作都必须首先通过总线(通常是PCI-express)复制到视频卡。 GDI实际上是从图形内存中删除了许多级别。
OpenGL,Direct3D,Direct2D,GDI和GDI +都是抽象层。 GPU供应商编写一个接受这些标准命令功能的驱动程序,以卡特定格式重新编码数据,然后将其发送到卡。通常,OpenGL和Direct3D是最优化的,并且还需要最少量的重新编码。
Windows如何结合各种屏幕窗口来创建全屏图像,在很大程度上取决于您所谈论的Windows版本。 DWM更改了所有内容。由于DWM是在Vista中引入的,程序会渲染到GPU内存的个人区域,然后窗口管理器使用视频卡的纹理查找单元将每个程序的各个区域有效地分层到屏幕主缓冲区上。当程序(通常是游戏)请求全屏独占访问时,将跳过此步骤,驱动程序会使该应用程序的渲染命令直接影响主屏幕缓冲区。
假设CPU正在生成需要显示的数据,最快速且最有效的方法可能是将数据块复制到顶点缓冲区对象中,并使用OpenGL命令将其光栅化为线条或多边形或其他任何内容(或Direct3D等效物)。如果您以前认为GDI是低级别界面,那么您需要先阅读一些内容才能完成这项工作。但它比纯GDI快几个数量级。事实上,新架构的速度要快得多,GDI(和WPF)建立在Direct2D和/或Direct3D之上。
答案 1 :(得分:1)
但我想要最快的连接到屏幕
我想从头开始控制像素数据
你要求不可能的事。使用GPU加速功能时,您可以获得最佳性能。但是,在这种情况下,您无法直接访问像素数据,并且尝试访问它(读取或写入)将对性能产生负面影响,因为您必须将数据从系统内存传输到视频内存。因此,应该小心处理从系统内存流式传输到视频内存的任何内容。另外,你必须学习API。
如果您“从头开始”并在CPU上进行渲染,您将可以轻松访问像素数据并完全控制渲染,但性能将不如GPU(CPU不太适合并行处理和系统内存可以比视频内存慢一个数量级,加上你将花费大量时间重新发明轮子。
Opengl和DirectX是否可以编译到GDI级别,或者他们是否采用特殊方式,是绕过还是使用类似的代码?
没有。它们几乎直接使用硬件制造商提供的驱动程序与图形硬件通信。而且,DirectX / OpenGL使用的那些“直接硬件访问”接口将无法使用 - 它们是特定于硬件和制造商的,可以是内部的,甚至可能受专利保护。
当然,您可以使用的传统硬件接口很少(即VESA或VGA 13h模式),但是,操作系统通常禁止直接使用它们(您无法在Windows上轻松访问VESA),因此,要访问它们,您必须启动MS-DOS,使用自定义操作系统或帮助程序类(例如Linux上的SVGAlib),这些类可能仅在root权限下运行。当然,即使您实际上使用VESA / VGA自行渲染,在任何硬件上(比RivaTNT 2 Pro更新)与OpenGL / DirectX完成的硬件加速渲染相比,性能也会非常糟糕。你有没有看到windows xp在没有合适的GPU驱动程序时需要多快(需要一秒时间重绘窗口)?这就是使用直接VESA / VGA访问的速度。
请不要问我为什么要这样做。
有理由问你为什么要那样做。你的“我想直接低级别访问”的方法可能适用于15。20年前或DOS时代。现在合理的解决方案是使用现有的API(由不是你的人维护)并寻找一种充分利用它的方法。当然,如果你想开发驱动程序,那将是另一个故事。
答案 2 :(得分:0)
Opengl和DirectX是否可以编译到GDI级别,或者有一种特殊的方式来实现它
和
我意识到大多数人都会使用Opengl或DirectX。但是,我不想要开销
所以你所说的是**你完全不知道OpenGL或DirectX究竟做了什么,但你已经确定它们不够高效,无法满足你的需求。
对不起,这是胡说八道。回答这样的问题是不可能的。
在现实世界中,你有一台专门用于制作图形的小型超级计算机。并且您可以通过OpenGL和DirectX访问它。
他们快速的原因是他们 NOT 只是“从头开始并控制像素数据”。
所以,如果你想要认真的答案,请尝试让那些有知识的人回答你的问题,以决定哪个问题最好。
如果你想要高效的图形,正确的答案是使用DirectX或OpenGL。