2013-07-31 48 views
18

這是我當前的設置:我正在使用SDL(目前在Linux上)進行OpenGL渲染。我初始化SDL(SDL_Init)並在主線程中創建應用程序窗口(SDL_CreateWindow)並將其傳遞給第二個線程。第二個線程從它創建一個OpenGL上下文(SDL_GL_CreateContext)並啓動一個渲染循環,而主線程監聽事件。我認爲重要的是要注意GL呼叫完全侷限於第二個線程;實際上我的大部分應用程序邏輯都發生在那裏,主線程只負責處理通過SDL發送的事件。SDL 2.0:在主線程中創建窗口,但在單獨的窗口中進行所有渲染

原來我是這樣做的另一種方式,但事實證明,你不能處理除OSX主窗口以外的任何事件,也可能是Windows,所以我將它切換到兼容這兩個在未來。

我是否應該擔心這在OSX/Windows上不起作用?在Linux上,我什麼都沒有。互聯網上有很多關於上下文共享和從多個線程進行GL調用的信息,但我想要做的就是在一個不是主要線程的線程中執行OpenGL。我不想繼續編寫我的應用程序,以後才發現它不能在其他地方使用。

+0

聽起來沒問題。還有另一個線程在這裏... [鏈接](http://stackoverflow.com/questions/6172020/opengl-rendering-in-a-secondary-thread?rq=1) – user1961169

+0

@ user1961169謝謝,我已閱讀你鏈接的線程。那個人在Linux/X11上遇到了麻煩,對我而言,這對我來說非常完美,它只是我不確定的OSX/Win32。不過,該主題中有一些評論意味着在這些平臺上它應該沒問題,所以感謝提醒我! – Ancurio

+0

唯一要保證的是操作系統的東西調用在App主線程中。如果不是,那麼它會創建經常奇怪的行爲(在展臺贏和Linux),如句柄的失效,偶爾的例外,圖形工件,場合GUI錯誤等... – Spektre

回答

2

我有一個應用程序可以在Mac/iOS/Windows上以這種方式構建(所有GL都在渲染線程中),但我不使用SDL。

我只是看了一下SDL的Cocoa_GL_CreateContext(在OS X上調用SDL_GL_CreateContext),它調用了我從主線程創建的上下文。

因此,如果遇到任何問題,請嘗試在主線程中創建GL上下文,然後將其傳遞給呈現線程(而不是在呈現線程中創建GL上下文)。

2

OpenGL和多線程基本上是敵人:任何時候只有一個線程可以'擁有渲染上下文' - 是的,每當線程切換時都可以切換GL渲染上下文,但考慮成本,從一位原始設備製造商的驅動程序到下一個,這不是很好的支持,並可能適用於某些人而不是其他人。 唯一合乎邏輯的(也是理智的)選擇是將所有的OpenGL調用保留給一個線程(注意:有例外,任何線程都可以在gl中調用與流數據有關的事情,而不需要擁有渲染上下文)。 不幸的是,我們不能簡單地按照建議在線程周圍傳遞GL上下文,我們必須調用(w)glMakeCurrent,它告訴GL「此調用者線程現在擁有您」,但未能告訴其他線程...