Opengl多執行緒終究是浮雲

2021-08-27 06:15:16 字數 1226 閱讀 1249

在opengl裡面使用多執行緒載入紋理是很美好的構想。

網上討論這個的並不多。中文部落格裡

其基本思路如下:

要建立新的rendering context (rc), 先需要device context(dc).

dc可以在得到hwnd後得到:

hdc hdc = getdc(hwnd);

接下來使用windows extension函式:wglcreatecontext建立rc。如果失敗返回null。

在這裡我們用1個hdc建立2個rc:

hglrc rendcontext1 = wglcreatecontext(hdc);

hglrc rendcontext2 = wglcreatecontext(hdc);

接下來我們用1個rc載入,乙個用來渲染。困難的是你必須共享2個rc之間的資源。

因為你在乙個rc中建立的紋理在另外乙個rc中是不可訪問的,反之亦然。

使用這個方法共享rc:

wglsharelists(rendcontext2, rendcontext1);

最好在呼叫context任何操作前完成這個操作!最好在與opengl做任何互動前呼叫。

renderingthread()

loadingthread()

再次注意,wglsharelists 只能在程序內工作。所以使用多執行緒而不是多程序。

wglmakecurrent只是設定本執行緒的預設rc。所以並不關心其他執行緒在幹什麼。

現在你可以在load執行緒裡放心的呼叫載入,如glgentextures、gltexparameteri、glteximage2d了。

而render執行緒也可以訪問load執行緒的資源。

如果你想在render執行緒裡也載入,記住某些庫( devil)不支援多執行緒載入。自己去做執行緒互斥把。

我沒有嘗試多執行緒渲染。但從網上資料來看,即使有也沒有意義。 openglz的contexts切換會帶來大量額外負擔。

在程序的最後要釋放並刪除contexts。

wglmakecurrent(null, null).

以上是作者的基本思路。

在我的專案裡,我嘗試用乙個執行緒專門用於動態載入紋理。

看上去執行的不錯。不幸的是,當紋理載入頻率教高的時候,紋理會出現白框和閃爍。

在ati的某些顯示卡上效果會好很多,基本看不到奇怪現象;在nv的顯示卡上相當明顯。

這個問題尚沒有完美解決。基本只能在多執行緒裡將紋理讀到記憶體,然後在主渲染執行緒裡讀入視訊記憶體。

愛這條路終究是要走完的

不知道你身邊會不會有這樣乙個姑娘?她說話爽朗 辦事利落,一條路從不拐彎,好像沒有什麼會把她打敗,姑且就叫她霸道小姐吧。可霸道小姐,也會在愛情這條路上,悄悄地拐了乙個彎。她說,很多事只有到了盡頭,才能看見轉角。霸道小姐的事蹟簡單的筆墨描寫不完,總結下來就是乙個表面乖乖女實則背後藏了一段頂撞老師 逃課打...

我們終究是一群平凡的人

1 我們終究是一群平凡的人,想要突破階層的桎梏很難。2 不要去艷羨別人的生活,每個人選擇的路線都不同。3 不能太舒服,太舒服就會有問題。4 打工終究只能解決溫飽問題,遠遠不能達到小康的水平。在工作性質不是高精尖的情況下,或許只有創業才能獲得經濟與時間上的自由。5 溫水煮青蛙很可怕,沒有激情的時間最難...

OpenGL多執行緒

在opengl裡面使用多執行緒載入紋理是很美好的構想。網上討論這個的並不多。中文部落格裡 其基本思路如下 要建立新的rendering context rc 先需要device context dc dc可以在得到hwnd後得到 hdc hdc getdc hwnd 接下來使用windows ext...