1

在后台缓冲区和前台缓冲区之间交换时,后台缓冲区中的内容变得未定义。我想使用“窗口系统”来定义它,例如 GLX、EGL、WGL。使用诸如 OpenGL (glClear) 之类的“本机”渲染器是我的后备计划,不必费心提及它。它是备份的原因是因为我不想弄乱本机渲染上下文。对于这个问题,我会坚持使用 X/GLX,但如果您倾向于描述如何在其他环境中执行此操作,请继续。

从 Xlib 文档(http://www.x.org/docs/X11/xlib.pdf)中,我找到了一个操作 XClearWindow,用于清除带有“背景像素”的窗口(顺便说一句真棒的名字......不是)。

  1. XClearWindow 是否清除前/后或两个缓冲区?我猜后台缓冲区是有道理的,但我无法仅从 Xlib 文档中弄清楚……如果有人问起三重缓冲区,那不是我!
  2. 它是与 OpenGL 渲染同步的,还是我必须通过例如在操作之前调用 glxWaitGL 来同步自己?
  3. 命令是否阻塞,即停止直到完成?实施依赖?

关于如何在使用窗口系统 (GLX) 进行交换后清除后台缓冲区的其他建议已得到应用。

干杯!

4

2 回答 2

1

在后台缓冲区和前台缓冲区之间交换时,后台缓冲区中的内容变得未定义。

是的,这是一件好事。

我想使用“窗口系统”来定义它,例如 GLX、EGL、WGL

为什么?除此之外,这样做是不确定的,因为交换后的背景不会有任何好处。

如果 OpenGL DDX 知道它将同步的 XClearWindow,它充其量只会降低性能。在最坏的情况下,您会引入一个竞争条件,其结果是不可预测的。

关于如何在使用窗口系统 (GLX) 进行交换后清除后台缓冲区的其他建议已得到应用。

使用正确的 OpenGL 操作:glClear(…).

于 2016-03-31T19:04:41.813 回答
0

经过一番研究,我可能已经找到了解决方案。这些文件似乎是有序的,但我没有机会在实践中对此进行测试。一旦我得到一些工作,我会用代码更新答案。

XClearWindow 是否清除前/后或两个缓冲区?

X 没有双缓冲区的概念。每当与 X 对双缓冲窗口进行交互时,两个缓冲区都会受到影响。例外是读取操作,例如XGetImage仅在前端缓冲区上操作的操作。

然而,X 通过 X 双缓冲区扩展或 xdbe 扩展了双缓冲区概念:http ://www.x.org/releases/X11R7.6/doc/xextproto/dbe.html#dbeswapbuffers

xdbe 提供XdbeSwapBuffers类似于glxSwapBuffersGLX 提供的操作。有一些重要的区别:

  • XdbeSwapBuffers 不像 glxSwapBuffers 那样管理与任何客户端 API 的任何同步。用户必须手动执行此操作。幸运的是,GLX 提供了出色的同步操作(glxWaitGLglxWaitX),不会停止执行。这几乎回答了我的第二个问题。
  • glFlushglxSwapBuffers为当前上下文执行隐式刷新 ( )。XdbeSwapBuffers 没有。何时刷新或不刷新是应用程序设计者的决定。
  • XdbeSwapBuffers 可以在一次调用中交换多个窗口。
  • XdbeSwapBuffers 在交换时可能有不同的行为:'Undefined'、'Background'、'Untouched'、'Copied'。阅读链接了解详情。

为了在交换到预定义的颜色后清除,“背景”交换行为是要走的路。要清除的内容可以通过 X 进行配置,可以是像素图或单色(背景像素)。

命令是否阻塞,即停止直到完成?实施依赖?

在许多情况下,使用 X 的应用程序必须提供自己的同步机制。这将表明异步执行模式,但标准本身并不要求它。我会选择“定义的实现”,强烈建议大多数平台的大多数命令都是异步执行的。

于 2016-04-15T19:54:14.243 回答