Unity資源 載入最好需要做哪些事

2022-02-06 03:43:05 字數 3476 閱讀 3659

先上**

1)assetbundle:一種儲存「乙個或多個資源的轉變為某種利於傳輸等的特殊格式(二進位制之類)」的檔案。(我這邊是使用unity製作手遊的角度來說明)

簡稱ab.

2)物件池的概念。

3) gameobject:就是資源,直接可以new使用的類物件。簡稱obj。ab中存放的就是obj。

正常遊戲,資源是很多的,尤其是做遊戲。所以,你不可能一開始就把全部載入出來吧。

弊端 a:記憶體撐爆,很影響遊戲中的體驗。

b:一開始進入遊戲時太卡,卡太久,很影響體驗。

所以,一般遊戲初始化的時候,我們只會載入部分公共,核心,必須要載入的資源。當然啦,這個資源是在遊戲登入之前進度條中載入的。很常見的吧。

同理,在不同的模組根據所需,載入所需的資源。

綜上:資源分類大致 根據使用頻度分類,使用模組分類。(還有資源的型別分類,如音訊,mp4等)

1)讀取配置檔案

因為很多的資源,很多的資源存在各個依賴關係(重用,共用之類的),需要提前預知。unity打包資源之後,會自動生成streamingassets的清單,裡面包含所有資源,並且含有各個資源之間的依賴關係。將該清單中的關係儲存到mdicasset中。

2)讀取前的優化措施

crc加密:  首先,資源獲取肯定是需要通過key,這個key肯定是字串型別的路徑,因為路徑一般都比較冗長。

所以可以通過crc加密將字串的路徑轉為int型。(起到加密和優化作用)

3)正式開始讀取資源

已知有ab,ab中存放了obj,ab是我們已有的。 ab又不是我們直接可以使用的,我們可以直接使用的的是obj; 我們不能每次都直接載入ab或obj,

所以最好是ab和obj都有快取處理。

因為我們的目的是使用obj,所以我們先載入obj的快取。如果obj的快取沒有,我們再載入ab的快取。如果

loadobj

a.讀取obj快取資源

i. 讀取快取mdicasset,存在該資源的情況,引用計數增加,如果是從未引用過的資源,還需要在 mnoreferenceassetmaplist中移除;

ii.記憶體清理驗證

如果快取中沒有該資源的情況則需要計算當前使用記憶體,如果記憶體大於450m(總記憶體大於1g,這個是舉例,具體數值多少視執行環境,手機,pc等而定),清空快取中一半(自定義)的記憶體。

iii.增加編譯器模式下讀取方法。(obj快取資源沒讀到)

為了便於開發,因為一開始我不可能每上傳好乙個資源,都打包一次(將資源打包成二進位制)再載入,肯定不會這麼做。所以在測試環境中指明乙個可直接讀取的obj的方法。即增加編譯器模式開發的 方法.

b.讀取ab快取資源

i.通過massetitemdic找到這個資源對應的assetitem物件,看他在哪個ab中,返回對應的resourceitem。並判斷該item 中ab是否已經load,已經有則返回。

ii.沒有讀到。呼叫loadassetbunle(path)方法

massetbundleitemdic快取中讀取,如果存在,則assetbundleitem的refcount增加,並返回。如果不存在,則通過assetbundle.loadfromfile(引擎提供的載入ab的方法)。得到ab,並返回。

每次assetbundleitem為null時,需要new(但是這邊我們做乙個物件池的處理,不能每次都new),使用classobjectpool獲取類物件。(不用new,在物件池中獲取,由objectmanager管理,classobjectpool為類物件池)

iii.載入依賴關係。

我們如果載入乙個ab的時候,他存在依賴關係,我們還需要之後載入該ab存在的依賴關係的ab。這是必須要做的,也是最麻煩的。(這邊不好講,太複雜,又太簡單,簡而言之了...)

iv.獲取到想要的ab之後,抽出需要的obj,並快取到mdicasset中。

c.關於物件池的使用

objectmanager,物件管理器,類物件池中的例項生成,一般在切換場景,載入進度條之類的時候生成,這樣,在load時候,不會有頻繁的new。

classobjectpool,類管理器。

1.為何要釋放

因為記憶體的問題,如果你不主動釋放,他會被動,自動釋放。被動,自動釋放都是未知的,不能再關鍵時刻

出現釋放,因為釋放的時候會影響幀率,影響遊戲體驗。所以一般我們最好保證記憶體不會自動釋放,故,我們需要做主動釋放。雖然c#有自動

垃圾**機制。但是這僅僅是對於託管資源(就是可以自動釋放的)的,非託管資源.net是不會自動釋放的。

一般是切換場景時候釋放,或者說若干模組功能結束後需要釋放。

a.清理的時候,只能清理mnoreferenceassetmaplist中的資料,很明顯,就是清理掉所有沒有被引用的資源。

b.釋放crc這個資源對應的物件池。

c.釋放所佔ab引用

解除安裝assetbundleitem,需要item.assetbundle.unload(false)

item.assetbundle = null

d.注意非例項化出來的不能destroy,item.obj = null

Unity 資源載入

本地載入 不能載入ab包 object obj resources.load 資源名稱或路徑下的名字 不需要副檔名 t t1 resources.load 資源名稱或路徑下的名字 不需要副檔名 表示載入resources目錄下指定的資源 object objs resources.loadall 資...

Unity載入資源方法

unity中的物體可以分為 資源和例項物件 兩種,一種是需要例項化出來的,一種是不需要例項化出來的,例如 動畫控制器 runtimeanimatorcontroller 精靈 sprite 音訊資源 audioclip 貼圖 texture2d 等.他們都是被unityengine 下的object...

unity 載入預製物體資源

1,在unity assets目錄下建立resources目錄並把資源放在裡面 2,在掛在的指令碼中先載入資源 gameobject obj resources.load ttt 如果放在resources目錄下建的目錄下,如在resources rrr 則為gameobject obj resou...