1

图形用户界面隐藏了神秘的机制。它将 2D 和 3D 上下文混合在一个屏幕上,并允许这两个截然不同的世界无缝组合。但是它们实际上以何种方式和在哪个级别交错?

实践表明,可以将 OpenGL 上下文嵌入到 2D 小部件库中,因此整个 2D 界面可以支持 OpenGL。此外,一些应用程序可能会探索硬件加速,而其他应用程序则不会(在同一屏幕上呈现时)。图形卡是否“了解”屏幕上的 2D 和 3D 区域以及窗口管理器是否会产生有凝聚力的前端的错觉?...当滚动网页或在屏幕上移动视频播放器时,人们会注意到加速窗口(3D、视频)“跳跃”以适应 2D 界面。

这个问题似乎微不足道,但我还没有遇到任何人能够给我一个全面的答案。一个答案,它可以让我将 OpenGL 上下文嵌入到 GTK+ 应用程序中,并了解它为什么以及如何工作。我已经尝试过 GtkGlExt 和 GLUT,但我想深入了解这个主题并编写自己的解决方案作为学术项目的一部分。我想知道 X、GLX、GTK、OpenGL 和窗口管理器之间的关系是什么,以及如何探索这个库网络以有意识地对其进行编程。

我不希望有人会在这里写一篇论文,但我会感谢任何关于该主题的文章的指示、建议或链接。

4

1 回答 1

7

你想的太多太多太复杂了。像 GTK+ 或 Qt 这样的工具包在某些东西上添加了相当多的抽象层,这实际上相当简单:您系统的图形设备由一个处理器和一些可以运行的内存组成。在最简单的情况下,处理器是普通的系统 CPU,而内存是普通的系统内存。但是,现代计算机具有专用图形处理器 (GPU),它具有自己的高带宽内存。

内存保存帧缓冲区。从逻辑上讲,帧缓冲区是一个二维值数组。可以对 GPU 进行编程,以某种方式处理帧缓冲区中的值。这可用于绘制帧缓冲区。显示图片的监视器连接到一个特殊的电路,该电路连续地将内存中某个帧缓冲区的数据馈送到屏幕(通常称为 RAMDAC 或 CRTC)。所以在 GPU 的内存中有一个帧缓冲区,它直接进入屏幕。如果你在那里画画,屏幕上就会出现东西。

像 X11 服务器这样的程序可以加载“知道”如何对 GPU 进行编程以绘制图形基元的驱动程序。X11 本身定义了某些图形基元,扩展模块可以添加更多的图形基元。X11 本身允许将 GPU 内存上的帧缓冲区分离到称为 Drawable 的逻辑区域中。屏幕帧缓冲区上的可绘制对象称为 Windows。由于逻辑窗口可以重叠,X 服务器还管理 Z 堆叠,它用于对窗口进行排序以进行重绘。每次客户端想要绘制到 X11 服务器会告诉 GPU 的某个窗口时,绘制操作将只修改帧缓冲区的那些像素,其中绘制到的窗口是可见的(这称为“像素所有权测试”)。X11 服务器也会创建 Drawables(即 帧缓冲区),它们不属于屏幕上的帧缓冲区内存区域。这些在 X11 术语中称为 PBuffers 或 Pixmaps(也有一个特殊的扩展,它也可以将窗口移出屏幕)。

然而,所有这些 Drawables 只是内存。从技术上讲,这些是画布上的东西。这被称为“图形原语”。X11本身提供了一定的集合,命名为X core。还有一个名为 XRender 的事实上的标准扩展,它提供了 X 核心中没有的原语。然而,X11 核心和 XRender 都没有提供可以生成 3D 绘图印象的图形基元。所以还有另一个扩展,称为 GLX,它教 X11 服务器另一组图形基元,即 OpenGL 的形式。

然而,X 核心、XRender 和 GLX/OpenGL 都只是不同的笔、画笔和铅笔,它们都在同一种 Canvas 上运行,即由 X11 管理的简单帧缓冲区。

那么像 Qt 或 GTK+ 这样的工具包呢?好吧,他们使用 X11 和它提供的图形基元来实际绘制小部件,例如按钮、菜单和类似的东西,而 X11 不知道这些。

于 2013-08-01T23:42:49.650 回答