2013-12-21 98 views
5

所以有趣的是我從未有過的OpenGL上下文丟失(其中所有的緩衝資源被全殲)直到現在。我目前正在使用OpenGL 4.2,通過SDL 1.2和Win7 64上的GLEW,同時我的應用程序也被打開,無法在運行時切換到全屏(僅在啓動時允許)。OpenGL上下文損失

在我的開發機器上下文似乎永遠不會丟失重新調整大小,但在其他機器上,我的應用程序可能會丟失OpenGL上下文(這似乎很少見)。由於內存限制(我有很多內存被應用程序的其他部分使用),我沒有在系統內存中備份我的gl緩衝區內容(VBOs,FBOs,紋理等),奇怪的是,這不是一個問題我過去是因爲背景永遠不會被抹去。

在什麼情況下OpenGL上下文將會丟失(其中所有GPU內存緩衝區都被擦除),而不是在全屏和窗口之間進行切換,很難從谷歌搜索中辨別出來。

回到我的DX時代,上下文丟失可能會發生,原因很多,我會在它發生時收到通知,並從系統內存備份中重新加載緩衝區。我是在這個假設之下(而且我可能在這個假設上是錯誤的)OpenGL(或像SDL這樣的管理庫)會爲我處理這個緩衝區重新加載。這在某種程度上甚至是部分真實的嗎?

我遇到的一個問題是,在調整大小時丟失上下文很不方便,我使用ALOT GPU內存,並且不得不重新加載所有內容,可能會暫停應用程序(但時間長於我的願望) 。

這是一個與設備相關的事物或驅動程序依賴?它是設備,驅動程序和SDL版本的組合嗎?如何檢測到這種情況下的損失,以便我可以對此做出反應?

標準做法是保持所有gl緩衝區內容的系統內存內容,以便它們可以在上下文丟失時重新加載?或者是一種罕見的情況下損失,這是不標準的做法?

+1

我們需要在某個時候看到OpenGL上下文丟失的程序代碼。 – Vallentin

回答

3

您正在使用SDL-1.2。對於SDL-1.2,當窗口被調整大小時,OpenGL上下文很有可能會重新創建(即正確關閉並重新初始化)。這是SDL的一個已知限制,並已在SDL-2中解決。

因此,無論使用SDL-2或使用一個已經對OpenGL量身定製,就像GLFW不同的框架。

或者是一種罕見的情況下損失,它不是標準的做法?

OpenGL上下文不會「丟失」。它們被釋放,這就是SDL-1.2在某些情況下所做的。在OpenGL

3

上下文重置(虧損)幕後的通常處理完全透明。從字面上看,沒有人在應用程序內存中保留GL資源以處理丟失的上下文,因爲除非您使用OpenGL的新擴展(健壯上下文),否則無法知道何時在OpenGL中發生上下文重置以處理丟失州。驅動程序通常會爲您執行所有操作,但您可以收到通知並定義與上下文重置相關的行爲,如標題2.6 - "Graphics Reset Recovery"中所述。

但要知道,在OpenGL中丟失的情況下是在D3D丟失的情況下非常不同。在GL中,丟失的上下文是因爲發生了一些災難性錯誤(例如,着色器需要太長的時間或內存訪問衝突),並且在像WebGL這樣的東西中最有用,它比普通的GL有更嚴格的安全/可靠性限制。在D3D中,只需通過Alt + Tab鍵或從窗口模式切換到全屏模式即可丟失上下文。無論如何,我認爲這是一個SDL問題,與GL的上下文重置概念根本沒有關係。

+2

這實際上是一個SDL-1.2問題。 SDL-1.2無法很好地處理調整大小,並且一些代碼路徑實際上會執行完全重新初始化。因此,你不應該將它用於OpenGL,而是SDL-2,它已經清除了這些東西。 – datenwolf