有没有办法确定CGLFlushDrawable对后台缓冲区做了什么?

时间:2012-06-09 14:27:24

标签: macos cocoa opengl buffer wgl

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

  

CGLFlushDrawable

     

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

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

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

  

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

还有this个州

  

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

这是我的问题:

  1. 如果后台缓冲区被复制,是否有保证,即使没有后备存储属性,它的内容也会被保留?
  2. 如果交换缓冲区,后缓冲区是否获取前缓冲区的内容,还是未定义,以便它可以随机获取?
  3. 系统可能选择交换缓冲区,但有没有办法确定它是否 选择这样做?
  4. 在任何一种情况下,有没有办法确定缓冲区是否被保留,与前缓冲区交换还是搞砸了?
  5. 此外,任何有关如何在WGL,GLX或EGL中制作的信息都将受到赞赏。我特别需要问题4的答案。

1 个答案:

答案 0 :(得分:1)

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

    我不确定您对WGL,GLX和EGL的要求。