首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从应用程序到硬件级别的GUI输出如何工作?

从应用程序到硬件级别的GUI输出如何工作?
EN

Stack Overflow用户
提问于 2012-01-08 20:33:44
回答 2查看 2.9K关注 0票数 12

我正在研究GUI编程,并做了一些研究。现在对我来说,并不是所有的事情都是清楚的。如果我使用GTK+作为工具包,它如何与显卡通信?

在Linux系统上,我认为应该是GTK --> X Server --(OpenGL)-->图形卡。是这样的吗?

我读到一些GUI直接绘制OpenGL (例如Blender3D),那么其他应用程序如何绘制它们的GUI?

如果显卡的API(据我所知)只有Direct3D和OpenGL,那么软件渲染和硬件加速之间的区别是什么?

执行“软件渲染”的软件是否可以直接写入显卡的帧缓冲区,从而使OpenGL不受影响?

PS:很抱歉问了这么多问题,但我真的不太明白这一切是如何工作的,谢谢你的每一个回答:)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-08 21:24:27

在Linux系统上我想应该是GTK --> X服务器--(OpenGL)-->图形卡。是这样的吗?

不是的。Linux上的GTK+ goes

代码语言:javascript
复制
                                              /-[ if direct context ]---\
                     /--> OpenGL >-+---------/                           \
                    /              \-> GLX -+--------------\              \
                   /                         \              \              \
GTK+ -+-> cairo >-+---> XRender >--------+----+-> Xlib/xcb >-+-> X server >-+-> Kernel Module >-> GPU
       \           \–-> pixmap buffer >–/
        \                              /
         \―---------------------------/

我读到一些GUI直接绘制OpenGL (例如Blender3D),那么其他应用程序如何绘制它们的GUI?

它只是"Blender“(没有拖尾的3D)。Blender的图形用户界面工具包使用OpenGL作为其唯一的后端,是的。但是图形用户界面不是直接使用OpenGL绘制的,使用起来太麻烦了(使用OpenGL调用绘制每个按钮。Blender有自己的工具包。GTK+是另一个工具包,但没有绑定到Blender (实际上,我最喜欢的项目之一就是提取Blender的图形用户界面工具包,以便可以在独立的项目中使用)。

像GTK+和Qt这样的工具包是为最大限度地提高可移植性而设计的。Blender有幸知道将会有OpenGL可用。为GTK+或Qt开发的应用程序可能能够在非3D功能的系统上运行,因此GTK+和Qt的设计允许在许多后端上运行。GTK+现在的版本3使用Cairo图形引擎作为图形后端。Cairo也有自己的后端,即绘制到像素图(像素图像)中的软件光栅化器,或者将绘制命令代理到底层图形体系结构。对于Linux上的Cairo,这可能是OpenGL或X11 (核心和XRender协议扩展)。

如果显卡的API(据我所知)只有Direct3D和OpenGL,那么软件渲染和硬件加速之间有什么区别?

OpenGL和Direct3D都不能与图形卡通信。它们与显卡的驱动程序进行通信。因此,你的选择将是,你自己与驱动程序交谈,绕过OpenGL和Direct3D。但是你为什么要这么做呢?太乏味了。

在视窗系统上,你还有GDI和/或WPF (视窗展示基础)来绘制东西,还有Direct2D。

在Linux上,你可以使用X11核心和XRender扩展协议来绘制漂亮的图片。

另一个正在兴起的API是OpenVG,它的目标是标准化所有这些2D绘图API。至少在Linux中,OpenGL和OpenVG已经被选择成为长期唯一可用的抽象绘图API,并使用一些窗口系统来管理帧缓冲区和用户输入。Wayland正在开发中(我完全不喜欢这种设计)和X11,我认为它的设计更好(它是一个面向网络的系统,允许分布式执行,这是我认为未来非常重要的事情),但它需要彻底改造成一些"X12“-清理遗留的繁琐,使其在联系人颜色空间中操作,使连接可转换(以便您可以在X服务器之间迁移客户端,这将允许一种更优雅的锁定X会话的方式,通过将所有连接移动到某个影子X服务器,而不是试图使用锁定屏幕保护程序来阻止访问)。

做“软件渲染”的软件能不能直接写到显卡的帧缓冲区中,这样OpenGL就不会被触动?

而不是在现代操作系统上。但是,操作系统可能会通过一些帧缓冲区API (Linux上的/dev/fb0)提供对图形卡的抽象访问。但是,帧缓冲区是非托管的,所以如果X服务器或Wayland正在运行,这两个服务器中的任何一个都在管理FB的任务中,那就不关你的事了。

票数 15
EN

Stack Overflow用户

发布于 2012-01-08 21:55:28

做“软件渲染”的软件能不能直接写到显卡的帧缓冲区中,这样OpenGL就不会被触动?

不完全是,或者更准确地说:取决于驱动程序。像XServer (或者Windows和MacOS的等价物)这样的显示系统不使用API,而是描述一个API。具体地称为显示驱动器必须满足的驱动器模型(或者在XServers的情况下称为诸如XAA、EXA、UXA和DRI的多个模型中的一个)。

在这些模型中没有定义的所有事情都必须在“软件”中完成,并在CPU上进行计算。此外,由模型定义的一些操作也可以由驱动程序在CPU上计算。

OpenGL过去是完全独立于这些模型的标准。显卡驱动程序根本不需要实现OpenGL即可供操作系统使用。但随着3D图形的持续集成和现代操作系统中更复杂的合成,驱动程序模型已经开始依赖于与OpenGL和Direct3D相同的范例。例如,WDDM ( Windows Display Driver Model)完全需要Direct3D 9的支持。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8777531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档