根据 Apple 的文档,CGLFlushDrawable
或者它的 Cocoa 等价物flushBuffer
可能会以几种不同的方式表现。通常对于窗口应用程序,后台缓冲区的内容被复制到可见缓冲区,如下所述:
CGLFlushDrawable
将双缓冲上下文的后缓冲区复制到前缓冲区。
我假设绘图缓冲区的内容保持不变(请参阅问题 1。)。即使我错了,也可以通过将kCGLPFABackingStore
属性传递给CGLChoosePixelFormat
.
但进一步阅读显示,在某些情况下,缓冲区可能会被交换而不是执行复制:
如果后备存储属性设置为 false,则可以交换而不是复制缓冲区。在全屏模式下经常出现这种情况。
这也说明了
当全屏窗口上方没有内容时,Mac OS X 会自动尝试优化此上下文的性能。例如,当您的应用程序调用对象
flushBuffer
时NSOpenGLContext
,系统可能会交换缓冲区,而不是将后台缓冲区的内容复制到前台缓冲区。(...) 因为系统可能选择交换缓冲区而不是复制它们,所以您的应用程序必须在每次调用flushBuffer
.
这是我的问题:
- 如果复制了后台缓冲区,是否可以保证即使没有后台存储属性也可以保留其内容?
- 如果缓冲区被交换,后缓冲区是否获得前缓冲区的内容,或者它是否未定义所以它也可以得到随机的东西?
- 系统可能会选择交换缓冲区,但有什么方法可以确定它是否 确实选择了这样做?
- 在任何这些情况下,有没有办法确定缓冲区是否被保留、与前缓冲区交换或被搞砸了?
此外,任何关于它是如何在 WGL、GLX 或 EGL 中制作的信息都将不胜感激。我特别需要问题 4 的答案。