【发布时间】:2016-07-28 07:23:03
【问题描述】:
在 MacOS 上合成像 Quartz 这样的窗口系统是如何工作的?
单个应用程序可以创建图形上下文并将它们与 GPU 上的帧缓冲区相关联。我假设窗口系统也必须这样做。但是窗口系统如何访问所有的应用程序帧缓冲区并将它们合成到它自己的呢?
当应用程序不“拥有”屏幕时,是否会出现屏幕撕裂问题?唯一可能发生“撕裂”的地方是窗口系统正在读取应用程序的帧缓冲区(或其他东西)。
【问题讨论】:
在 MacOS 上合成像 Quartz 这样的窗口系统是如何工作的?
单个应用程序可以创建图形上下文并将它们与 GPU 上的帧缓冲区相关联。我假设窗口系统也必须这样做。但是窗口系统如何访问所有的应用程序帧缓冲区并将它们合成到它自己的呢?
当应用程序不“拥有”屏幕时,是否会出现屏幕撕裂问题?唯一可能发生“撕裂”的地方是窗口系统正在读取应用程序的帧缓冲区(或其他东西)。
【问题讨论】:
有几种不同的方法可以实际实现这一点。但最常用的方法是,窗口系统本身负责创建窗口帧缓冲区和 OpenGL 上下文。 如果目标是一个窗口,应用程序不会单独创建 OpenGL 上下文和帧缓冲区!
但是窗口系统如何访问所有应用程序帧缓冲区并将它们合成到它自己的?
嗯,窗口系统首先是窗口帧缓冲区的实际所有者。这些应用程序只是对它们有租约。
当应用程序不“拥有”屏幕时,是否会出现屏幕撕裂问题?唯一可能发生“撕裂”的地方是窗口系统正在读取应用程序的帧缓冲区(或其他东西)。
这就是双缓冲的用途。缓冲区交换在合成重绘和应用程序渲染到后台缓冲区之间发生延迟,该后台缓冲区无法通过合成访问。合成只从前端缓冲区读取。
【讨论】: