我通过 GLX 在 Linux 中编写了一个 OpenGL 应用程序。它使用双缓冲与 glXSwapBuffers 和通过 NVIDIA X 服务器设置设置的同步到 VBlank。我正在使用 Compiz,并且窗口移动顺畅且无撕裂(在 Compiz 设置中启用了同步到 VBlank)。 但是当我
尝试移动 OpenGL 窗口或调整其大小
通过 OpenGL 窗口占用的区域移动其他窗口
系统卡顿并卡住 3-4 秒。搬家其他 OpenGL 窗口占据的区域之外的窗口一如既往地平滑。 此外,只有当 OpenGL 应用程序位于 生成动画帧的循环因此交换缓冲区。 如果内容是静态的并且应用程序不交换缓冲区,则没有问题,移动各个窗口也很顺利。 可能是我的应用程序和 Compiz 之间存在同步问题?
最佳答案
我不知道它是否还是几年前的样子,但是……
您的描述非常符合 Compiz 的问题。每次调整窗口大小都会触发重新创建将接收窗口内容的纹理。纹理创建是一项成本高昂的操作,因此应该避免。不幸的是,Compiz 开发人员似乎并不是最聪明的人,因为他们没有意识到这个问题有一个明显的解决方案:X11 中的 Windows 可以在没有太多成本的情况下重新设置父级(每个窗口管理器都会这样做几次),这称为堆栈。 Compiz 是一个窗口管理器。
那么为什么 Compiz 不保留一个桌面大小的窗口,在其中重新调整那些即将调整大小的窗口的父级,从那里获取其恒定大小的窗口纹理,并在完成调整大小操作后将窗口重新调整到其装饰框架中?
我不知道为什么会这样。无论如何,Compiz 做的有些事情并不是很聪明。
如果您想解决这个问题,那么:Compiz 是开源的,我刚刚描述了该怎么做。
关于opengl - Compiz 和 OpenGL 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14128259/