2012-06-09 59 views
0

根据Apple的文档,CGLFlushDrawable或它的可可等价物flushBuffer可能会以几种不同的方式表现。通常,对于一个窗口应用程序后台缓存中的内容复制到可见缓冲区像它说here有没有办法确定CGLFlushDrawable在后台缓冲区中做了什么?

CGLFlushDrawable

复制一个双缓冲上下文前缓冲器的后缓冲器。

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

但进一步读取reaveals,即在某些情况下缓冲区可以被交换,而不是正在执行复制:

如果后备存储器属性设置为假,缓冲器可以被交换,而不是被复制。在全屏模式下通常是这种情况。

而且还this指出

在有你的全屏窗口上面没有内容,Mac OS X的自动尝试来优化这种情况下的性能。例如,当应用程序在NSOpenGLContext对象上调用flushBuffer时,系统可能交换缓冲区,而不是将后台缓冲区的内容复制到前台缓冲区。 (...)由于系统可能选择交换缓冲区而不是复制缓冲区,因此每次调用flushBuffer后,应用程序都必须完全重新绘制场景。

这里去我的问题:

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

还有关于它是如何在WGL,GLX或EGL制造的任何信息,将不胜感激。我特别需要对问题4的回答。

回答

1
  1. 不,不能保证。
  2. 它可能是随机的。
  3. 不,我不这么认为。
  4. No.如果你没有指定kCGLPFABackingStoreNSOpenGLPFABackingStore,那么你不能对后台缓冲区的内容做任何假设,这就是文档说你必须从头开始重新绘制每一帧的原因。

我不确定你在问关于WGL,GLX和EGL的问题。

+0

2.然后不会使用术语_swapping_会引起误解吗? 另外我编辑了我的问题,指定了我期望了解的有关WGL,GLX和EGL的内容。 –

+0

它可能会将后台缓冲区交换(或者,如果您愿意,可以切换)到前端(无需复制操作),但不会将前端缓冲区交换/切换回到后端。新的后台缓冲区可能来自池或成为新的未初始化的缓冲区。你被误导了,那么它可能会误导人。 ;) –

相关问题