【发布时间】:2014-11-17 20:25:27
【问题描述】:
我想设计一个简单的窗口管理器,能够合成来自多个进程的输出。我的第一个想法是只对独立应用程序使用不同的线程,所以我只使用一个上下文并在应用程序和管理器主线程之间共享它,但再想想这听起来不是一个好主意,因为任何线程崩溃将终止一切。
所以我决定它必须真正支持应用程序的专用进程,但这让我想到了一个问题,即我究竟如何以高性能的方式将来自不同进程的输出拼接在一起。将数据从 GPU 复制到 CPU 以共享系统内存根本不是一种选择。从 OpenGL 并行常见问题解答中可以清楚地看出,不可能使用来自多个进程的一个上下文,除非它是间接导致性能非常低的。
那么,现有的窗口管理器是如何做到的呢?当然,我不希望有任何低层次的细节,只是一般的概念概述。
【问题讨论】:
-
如果您的平台将句柄暴露在它所绘制的表面上,您可以这样做。 WDDM (Windows Vista+) 提供了一种称为共享句柄的东西来实现此目的,但是为任意进程访问一个句柄并不是您作为最终用户通常能够做的事情(从这个意义上讲,公共 API 提供的最好的东西是DWM“缩略图”)。不过,在其他平台上滚动您自己的合成窗口管理器要容易得多,尤其是 Linux。 您对什么平台感兴趣?
-
不幸的是,没有标准和可移植的解决方案。窗口合成器求助于使用供应商特定的扩展,通常甚至不直接使用。例如,Wayland 为此依赖 EGL。这是因为渲染在历史上是非常分散的,你有软件渲染,你有硬件加速的 Direct2D、Direct3D、OpenGL……这就是为什么缓冲区共享必须打破不同技术之间的差距。我想能够按标准在 OpenGL 的不同进程之间共享缓冲区会很不错,但没有迹象表明这会很快发生......
-
@AndonM.Coleman - 我希望有一些更便携的东西,这样它就可以在现有的 windows、linux 和 android 窗口管理器之上运行......
标签: opengl graphics window-managers multiprocess compositing