0

根据 Apple 的文档,CGLFlushDrawable或者它的 Cocoa 等价物flushBuffer可能会以几种不同的方式表现。通常对于窗口应用程序,后台缓冲区的内容被复制到可见缓冲区,如下所述

CGLFlushDrawable

将双缓冲上下文的后缓冲区复制到前缓冲区。

我假设绘图缓冲区的内容保持不变(请参阅问题 1。)。即使我错了,也可以通过将kCGLPFABackingStore属性传递给CGLChoosePixelFormat.

但进一步阅读显示,在某些情况下,缓冲区可能会被交换而不是执行复制:

如果后备存储属性设置为 false,则可以交换而不是复制缓冲区。在全屏模式下经常出现这种情况。

也说明了

当全屏窗口上方没有内容时,Mac OS X 会自动尝试优化此上下文的性能。例如,当您的应用程序调用对象flushBufferNSOpenGLContext,系统可能会交换缓冲区,而不是将后台缓冲区的内容复制到前台缓冲区。(...) 因为系统可能选择交换缓冲区而不是复制它们,所以您的应用程序必须在每次调用flushBuffer.

这是我的问题:

  1. 如果复制了后台缓冲区,是否可以保证即使没有后台存储属性也可以保留其内容?
  2. 如果缓冲区被交换,后缓冲区是否获得前缓冲区的内容,或者它是否未定义所以它也可以得到随机的东西?
  3. 系统可能会选择交换缓冲区,但有什么方法可以确定它是否 确实选择了这样做?
  4. 在任何这些情况下,有没有办法确定缓冲区是否被保留、与前缓冲区交换或被搞砸了?

此外,任何关于它是如何在 WGL、GLX 或 EGL 中制作的信息都将不胜感激。我特别需要问题 4 的答案。

4

1 回答 1

1
  1. 不,不能保证。
  2. 可能是随机的。
  3. 不,我不相信。
  4. 不。如果你不指定kCGLPFABackingStoreor NSOpenGLPFABackingStore,那么你不能对后台缓冲区的内容做任何假设,这就是为什么文档说你必须从头开始重绘每一帧。

我不确定您对 WGL、GLX 和 EGL 的要求是什么。

于 2012-06-09T15:29:20.953 回答