UE4異步載入資源


轉自:http://blog.ch-wind.com/ue4%E5%BC%82%E6%AD%A5%E8%BD%BD%E5%85%A5%E8%B5%84%E6%BA%90/

所有的“硬”指針指向的資源都會被UE4在啟動時進行載入,為了防止某些情況下引發的巨大延遲,必要的時候我們需要使用異步資源載入系統。

本文參考:https://docs.unrealengine.com/latest/INT/Programming/Assets/AsyncLoading/index.html進行整理。同時也是研究引擎的記錄。

對於異步載入有兩個類很重要:FStringAssetReferences和TAssetPtr。

FStringAssetReferences是對資源(Asset)的“軟”引用,這個結構在BP中使用起來就像是UObject指針一樣。而TAssetPtr是對FStringAssetReferences的一個弱引用封裝,同時規范所指向的類型,可以在需要的時候調用Get()來解析到具體的資源。

為了避免理解上的偏差,來實際測試一次是最快的。在代碼中添加如下屬性:

FstringAssetReference在可視化編輯器中顯示如下,確實是可以當作UObject指針來使用:

image

TAssetPtr則顯示如下:

image

大多數時候,異步載入一個單獨的資源基本沒什么意義,除非他真的很大。如果要批量異步載入資源的話,就需要用到Object Libraries。這個是Content brower用來進行資源篩選和顯示的類,在游戲邏輯中使用也是可以的。

上面的代碼對指定的目錄創建了一個Library,並且資源進行了載入操作。第二個步驟並不是必須的:

上面的代碼在ObjectLibrary中進行篩選並將找到的第一個資源返回。

得到AssetData之后可以將其轉換為FStringAssetReference,然后使用StreamableManager進行異步載入。

StreamableManager可以對傳遞給他的StringReference所引用的資源全部進行載入操作。上面的例子中ItemList的定義為TArray< TAssetPtr<UGameItem> >。也就說針對一個弱引用的列表,獲得所有的StringReference之后傳遞給StreamableManager進行一次性的異步載入。載入之后會調用回調函數以便及時進行處理。在回調函數之前,所有的引用都會被StreamableManager保留,防止其被垃圾回收。

如上,將StreamableManager和Object Libaries進行組合使用,即可實現異步的資源載入了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM