2

我通过 GLX 在 Linux 中编写了一个 OpenGL 应用程序。它使用带有 glXSwapBuffers 的双缓冲和通过 NVIDIA X 服务器设置设置的同步到 VBlank。我正在使用 Compiz 并且窗口平滑移动并且没有撕裂(在 Compiz 设置中启用了同步到 VBlank)。但是当我

  1. 尝试移动或调整 OpenGL 窗口的大小或

  2. 通过 OpenGL 窗口占用的区域移动其他窗口

系统卡顿并冻结 3-4 秒。将其他窗口移到 OpenGL 窗口占用的区域之外是一如既往的顺畅。此外,仅当 OpenGL 应用程序处于生成动画帧的循环中并因此交换缓冲区时,才会出现问题。如果内容是静态的并且应用程序没有交换缓冲区没有问题,则移动各个窗口是平滑的。可能是我的应用程序和 Compiz 之间的同步问题?

4

1 回答 1

2

不知道是不是还是和几年前一样,但是……</p>

您的描述与 Compiz SNAFU 非常匹配。每次调整窗口大小都会触发重新创建将接收窗口内容的纹理。纹理创建是一项昂贵的操作,因此应该避免。不幸的是,Compiz 开发人员似乎不是最聪明的人,因为他们没有意识到有一个明显的解决方案可以解决这个问题:X11 中的 Windows 可以在没有太多成本的情况下重新设置父级(每个窗口管理器都会这样做几次),这称为堆叠。Compiz一个窗口管理器。

那么为什么 Compiz 不保留一个桌面大小的窗口,在它周围重新设置那些即将调整大小的窗口,从那里获取其恒定大小的窗口纹理,并在完成调整大小操作后将窗口重新设置为它的装饰框架?

我不知道为什么会这样。无论如何,Compiz 做的一些事情并不是很聪明。

如果你想解决这个问题,好吧:Compiz 是开源的,我刚刚描述了该怎么做。

于 2013-01-03T00:31:15.350 回答