2014-10-09 53 views
0

我想在60 fps的CWnd窗口中做一些opengl 1.0動畫。我創建了一個子類的CWnd:MFC:如何從不同的線程繪製opengl?

類COpenGLControl:公衆的CWnd { ... }

我發現,如果我使用內置的定時器「SetTimer的()」,並將其設置爲開槍每1000/60毫秒,所有的opengl命令都能正確渲染。但是,如果我使用單獨的線程實現自己的計時器,則不會繪製任何內容。我得到的只是一個黑屏。

有沒有辦法從其他線程發出opengl命令?

+1

請閱讀:http://stackoverflow.com/questions/11097170/multithreaded-rendering-on-opengl – xMRi 2014-10-09 09:00:15

+0

感謝您的答覆。看完這篇文章後,看起來我所做的有點不同。我不想多線程渲染器。我只想在除了CWnd線程和跨平臺之外的單個線程中完成所有的opengl調用。這就是爲什麼我正在做我自己的計時器 – 2014-10-09 09:38:09

+1

也許錯誤代碼可能有助於調查。上下文必須綁定在您從中調用命令的線程中。 – Raki 2014-10-09 10:40:19

回答

1

即使您不打算從多個線程發出GL調用,您也必須考慮OpenGL的線程規則:OpenGL上下文一次最多隻能有一個線程使用。 (並且,每個線程在任何時候最多隻能有一個活動的GL上下文)。這並不意味着你不能在多個線程中使用相同的上下文,或者在一個線程中創建它並在另一個線程中使用它,你只需要明確地將上下文從一個線程「交付」到另一個線程。

我不知道你是否使用一些進一步的圖書館爲GL上下文處理,所以我假設你正在使用您的操作系統的本地API - 在這種情況下,wgl。相關功能是wglMakeCurrent()。因此,爲了將線程A中的「當前」上下文移交給線程B,線程A必須在線程B通過wglMakeCurrent(someDC, myGLCtx)獲得上下文之前首先調用wglMakeCurrent(NULL,NULL)。您當然可以隨意多次切換GL上下文,但這會帶來巨大的同步開銷,應該避免。

從您的評論:

會的工作。如果我在計時器線程也創建上下文?

是的,它會。

只是一個側面說明:創建是不是這裏的問題可言,因爲創建一個GL上下文不會自動使「當前」的話題 - 所以你可以在線程A創建事後使它當前直接線程B.

+0

非常感謝。這解決了我的問題。至於性能,所有的繪圖都將在計時器線程上完成。只有一些初始設置將在UI線程上完成,這將在定時器被觸發之前完成。所以我相信這應該沒問題。 – 2014-10-13 23:28:47