1

我想设计一个简单的窗口管理器,能够合成来自多个进程的输出。我的第一个想法是只对独立应用程序使用不同的线程,所以我只使用一个上下文并在应用程序和管理器主线程之间共享它,但再想想这听起来不是一个好主意,因为任何线程崩溃将终止一切。

所以我决定它必须真正支持应用程序的专用进程,但这让我想到了一个问题,即我如何以高性能的方式将来自不同进程的输出准确地拼接在一起。将数据从 GPU 复制到 CPU 以共享系统内存根本不是一种选择。从 OpenGL 并行常见问题解答中可以清楚地看出,不可能使用来自多个进程的一个上下文,除非它是间接导致性能非常低的。

那么,现有的窗口管理器是如何做到的呢?当然,我不希望有任何低层次的细节,只是一般的概念概述。

4

1 回答 1

1

那么,现有的窗口管理器是如何做到的呢?当然,我不希望有任何低层次的细节,只是一般的概念概述。

在 X11 中有 X11 扩展 GLX_ARB_texture_from_pixmap 和 Render,它们允许将窗口移出屏幕并将窗口的 X11 像素图绑定为 OpenGL 中的纹理。其实现方式的绰号称为 AIGLX(加速间接 GLX),尽管名称不依赖于间接 GLX 上下文。在这种情况下,间接意味着一切都发生在显示服务器上。

您的合成窗口管理器永远不会直接与其他进程对话。相反,它只是使用 X11 服务器中已经存在的资源和数据来合成最终结果。

这与 Wayland不同,合成器直接与其他进程对话以交换帧缓冲区信息。我个人更喜欢 X11 型号,但这只是我的看法。

于 2014-09-23T17:33:33.533 回答