2012-06-09 60 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

它可能會將後臺緩衝區交換(或者,如果您願意,可以切換)到前端(無需複製操作),但不會將前端緩衝區交換/切換回到後端。新的後臺緩衝區可能來自池或成爲新的未初始化的緩衝區。你被誤導了,那麼它可能會誤導人。 ;) –

相關問題