opengl - Compiz 和 OpenGL 窗口

标签 opengl window freeze compiz

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

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

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

系统卡顿并卡住 3-4 秒。搬家其他 OpenGL 窗口占据的区域之外的窗口一如既往地平滑。 此外,只有当 OpenGL 应用程序位于 生成动画帧的循环因此交换缓冲区。 如果内容是静态的并且应用程序不交换缓冲区,则没有问题,移动各个窗口也很顺利。 可能是我的应用程序和 Compiz 之间存在同步问题?

最佳答案

我不知道它是否还是几年前的样子,但是……

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

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

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

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

关于opengl - Compiz 和 OpenGL 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128259/

相关文章:

c++ - 是否弃用了 gluTess* 函数?

c++ - 使用 GLee(GL Easy Extension Library)构建错误

c++ - 如何重新创建/修改正交投影矩阵 (OpenGL)

javascript - 窗口对象、窗口函数和对象函数

vim: "extend"窗口进入下一个窗口

linux - 从 Linux 访问 Windows 应用程序控件

c++ - 调用 glDrawElements 导致访问冲突

python - PyQt GUI 在 Python 中多线程时卡住,直到线程完成

ios - iOS 14 更新后应用程序卡住在文本字段上

javascript - 当 Silverlight 调用 JavaScript window.alert/prompt 时 Windows Safari 卡住