根据Apple的文档,CGLFlushDrawable
或它的可可等价物flushBuffer
可能会以几种不同的方式表现。通常,对于一个窗口应用程序后台缓存中的内容复制到可见缓冲区像它说here:有没有办法确定CGLFlushDrawable在后台缓冲区中做了什么?
CGLFlushDrawable
复制一个双缓冲上下文前缓冲器的后缓冲器。
我假定绘图缓冲区的内容保持不变(见问题1)。即使我错了,也可以通过将kCGLPFABackingStore
属性传递给CGLChoosePixelFormat
来保证。
但进一步读取reaveals,即在某些情况下缓冲区可以被交换,而不是正在执行复制:
如果后备存储器属性设置为假,缓冲器可以被交换,而不是被复制。在全屏模式下通常是这种情况。
而且还this指出
在有你的全屏窗口上面没有内容,Mac OS X的自动尝试来优化这种情况下的性能。例如,当应用程序在
NSOpenGLContext
对象上调用flushBuffer
时,系统可能交换缓冲区,而不是将后台缓冲区的内容复制到前台缓冲区。 (...)由于系统可能选择交换缓冲区而不是复制缓冲区,因此每次调用flushBuffer
后,应用程序都必须完全重新绘制场景。
这里去我的问题:
- 如果后台缓冲区被复制,它是有保证的,它的内容是即使没有后备存储属性保留吗?
- 如果bufferse被交换,后台缓冲区是否得到前台缓冲区的内容,或者它是未定义的,所以它也可以得到随机的东西?
- 该系统可能选择交换缓冲区,但是有没有什么办法来确定它是否真的确实选择这样做?
- 在任何这些情况下,有没有办法确定缓冲区是否被保留,与前端缓冲区交换或混乱?
还有关于它是如何在WGL,GLX或EGL制造的任何信息,将不胜感激。我特别需要对问题4的回答。
2.然后不会使用术语_swapping_会引起误解吗? 另外我编辑了我的问题,指定了我期望了解的有关WGL,GLX和EGL的内容。 –
它可能会将后台缓冲区交换(或者,如果您愿意,可以切换)到前端(无需复制操作),但不会将前端缓冲区交换/切换回到后端。新的后台缓冲区可能来自池或成为新的未初始化的缓冲区。你被误导了,那么它可能会误导人。 ;) –