在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...