【问题标题】:How do windowing systems composite final screen?窗口系统如何合成最终屏幕?
【发布时间】:2016-07-28 07:23:03
【问题描述】:

在 MacOS 上合成像 Quartz 这样的窗口系统是如何工作的?

单个应用程序可以创建图形上下文并将它们与 GPU 上的帧缓冲区相关联。我假设窗口系统也必须这样做。但是窗口系统如何访问所有的应用程序帧缓冲区并将它们合成到它自己的呢?

当应用程序不“拥有”屏幕时,是否会出现屏幕撕裂问题?唯一可能发生“撕裂”的地方是窗口系统正在读取应用程序的帧缓冲区(或其他东西)。

【问题讨论】:

    标签: opengl graphics directx


    【解决方案1】:

    有几种不同的方法可以实际实现这一点。但最常用的方法是,窗口系统本身负责创建窗口帧缓冲区和 OpenGL 上下文。 如果目标是一个窗口,应用程序不会单独创建 OpenGL 上下文和帧缓冲区!

    但是窗口系统如何访问所有应用程序帧缓冲区并将它们合成到它自己的?

    嗯,窗口系统首先是窗口帧缓冲区的实际所有者。这些应用程序只是对它们有租约。

    当应用程序不“拥有”屏幕时,是否会出现屏幕撕裂问题?唯一可能发生“撕裂”的地方是窗口系统正在读取应用程序的帧缓冲区(或其他东西)。

    这就是双缓冲的用途。缓冲区交换在合成重绘和应用程序渲染到后台缓冲区之间发生延迟,该后台缓冲区无法通过合成访问。合成只从前端缓冲区读取。

    【讨论】:

    • 感谢您的回复。似乎窗口系统因此必须与平台的客户端图形实现有关联?我认为“撕裂”来自在读取前缓冲区时交换前/后缓冲区。但是合成过程本身不是作为双缓冲设置吗?应用程序渲染到一个缓冲区,并且该缓冲区被窗口系统周期性地读入另一个缓冲区。
    • @anon:是的,窗口系统通常不仅与图形系统有很强的联系。在许多情况下,它图形系统。可能令人困惑的是,窗口管理(装饰、放置、可见性状态)不一定是窗口系统本身的一部分。 X11 是一个窗口系统,Win32 GDI 或最近的 Wayland 也是如此。
    • @anon:关于双缓冲和合成。是的,理论上可以将合成过程本身用作双缓冲方法,但有一个重要的警告。合成是一种全有或全无操作。由于每次重绘都必须考虑每个窗口的每像素不透明度值,并且窗口内容相互交互,因此不可能仅选择性地重新组合选定的窗口(好吧,如果允许的组合操作集是有限的,它可以以某种方式完成,但这是不切实际的)。
    • @anon: (cont.): 如果所有窗口都以高于显示刷新率更新,这没有问题。然而,图形复杂的应用程序渲染其窗口内容的时间可能比单个显示刷新间隔要长得多。在这种情况下,合成器有两种选择:合成一个仅部分更新的窗口,这可能导致窗口内容撕裂或部分损坏,延迟整个屏幕合成,这将减少整个屏幕的显示更新率到最低公分母。撕裂可能是可以接受的,但其余的则不是!
    猜你喜欢
    • 1970-01-01
    • 2012-12-26
    • 2020-01-16
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多