多執行緒第一步 資源非同步載入

2021-04-23 10:19:38 字數 906 閱讀 6581

資源非同步載入恐怕是3d引擎中應用最為廣泛的多執行緒技術了,特別是在無縫地圖的網路遊戲中,尤為重要,我們公司3d引擎的資源載入部分採用了硬碟->記憶體->視訊記憶體兩級載入的模式,超時解除安裝也分兩級,這樣雖然實際效果不錯,但**非常繁瑣,在flagshipengine中,我設法將其進行了一定程度的簡化。

首先我們需要定義乙個resource基類,其包含以下幾個介面

load/release:從硬碟將檔案載入到記憶體

cache/uncache:從記憶體構建圖形api所需要的buffer

isready:判斷該資源是否已經準備好,可供渲染了

在實際遊戲中,載入資源的範圍大於視野,當攝像機移動到單元格邊緣,就應將新的單元格中的物件加入到資源載入佇列中,喚醒資源載入執行緒呼叫load介面進行載入,完成後將該資源的完成標記設為true。而通過可視剪裁所得到的最終可視實體,則需要呼叫cache介面構建影象api所需物件,當load和cache都完成後isready才會返回true,這時該資源才能開始被渲染。

解除安裝方面,在載入新的單元同時,解除安裝身後舊的單元,對單元內所有資源呼叫release,load/release帶有引用計數,仍被引用的資源不會被解除安裝。當某一資源長時間沒有被看見,則超時,呼叫uncache釋放vertexbuffer等影象api資源。

為了實現以上功能,我們需要乙個resourcemanager類,每幀檢查幾個已cache的資源,看起是否超時,另外也需對已載入的資源進行分類管理,註冊其資源別名(可以為其檔名),提供查詢資源的介面。

另外為了方便使用,我們需要乙個模板控制代碼類reshandle,包含setname和getimpliment兩個介面,setname設定該資源的別名,其內部呼叫resourcemanange的查詢方法,看此資源是否已存在,如不存在則new乙個新的,getimpliment則返回該資源物件,之後可以將該資源新增到實體中,而無需關心其是否已被載入。

踏出第一步

我是乙個比較內向的人,或許應該說有一點自卑的傾向。因為生活中的一些事情,總是不斷的打擊我的自信心,讓我產生一種感覺 我缺乏能力,是乙個無用的人。我想有過這種經歷的,肯定不只我乙個人。人的信心有時候是很脆弱的,兩三次的失敗就可能讓其消失殆盡,然後你就覺得,反正我也做不出什麼事情來,乾脆就這樣混著吧,於...

邁出第一步

我,乙個程式小白,不是為了熱愛而走上程式設計之路。就這樣稀里糊塗的度過了兩年,期間,自己有為找不出那乙個個errors煩躁,也有為成功編譯後而獲得正確結果的那種喜悅。如今是真的想去改變現狀,想去提公升自己,想不負剩餘的兩年時光,不負你,不負我!對於今後的學習之路的想法,首先基礎的語言學習,其次資料結...

爬蟲第一步

注意正規表示式的書寫注意正規表示式的書寫 import re import requests url headers html requests.get url,headers,timeout 10 text print html redata re.compile r for i in re.fi...