? 欧美日韩中文国产一区二区三区,日韩无码AV一区,日高清无码在线免费视频
聯(lián)系我們

給我們留言

聯(lián)系我們

地址:福建省晉江市青陽街道洪山路國際工業(yè)設(shè)計(jì)園納金網(wǎng)

郵箱:info@narkii.com

電話:0595-82682267

(周一到周五, 周六周日休息)

當(dāng)前位置:主頁 > 3D教程 > 圖文教程

UnrealEngine4異步加載關(guān)卡的實(shí)現(xiàn)方法及思考

來源: 52vr | 責(zé)任編輯:傳說的落葉 | 發(fā)布時(shí)間: 2019-06-13 08:15 | 瀏覽量:

Unreal Engine 4 —— 異步加載關(guān)卡的實(shí)現(xiàn)方法及思考

 
這篇文章介紹了在UE4中實(shí)現(xiàn)異步加載關(guān)卡的方法,以及我對(duì)應(yīng)的思考。
 
背景
 
在很多游戲中都有用到關(guān)卡的異步加載,關(guān)卡的異步加載指的是在游戲的某個(gè)階段,使用多線程的方法進(jìn)行新關(guān)卡對(duì)應(yīng)的內(nèi)容加載。從而能夠免去直接的Loading階段,提升游戲體驗(yàn)的效果。
 
目前這種方法被廣泛運(yùn)用于各種游戲,例如在游戲戰(zhàn)神Ⅲ中,主角有時(shí)會(huì)走過一段長長的山道,在此時(shí)實(shí)際上游戲就已經(jīng)在開始加載下一個(gè)關(guān)卡了(當(dāng)主角走出山道時(shí)如果還沒有加載完,則會(huì)顯示Loading界面);又例如在游戲暗黑血統(tǒng)Ⅱ中,主角解開謎題從一個(gè)房間進(jìn)入下一個(gè)房間時(shí),往往會(huì)有一段比較長時(shí)間的推門動(dòng)作,此時(shí)也是在進(jìn)行對(duì)應(yīng)關(guān)卡的加載……
 
Transition Map與異步加載關(guān)卡的異同
 
有人可能會(huì)將Transition map和異步加載關(guān)卡混為一談,但實(shí)際上這兩者是不一樣的。異步加載關(guān)卡指的是在當(dāng)前的主關(guān)卡中,使用其他線程進(jìn)行內(nèi)容的加載。而Transition Map指的是在需要進(jìn)行加載時(shí),給玩家一個(gè)幾乎瞬間就能加載完的關(guān)卡,這個(gè)關(guān)卡可能含有一些小游戲或者訓(xùn)練內(nèi)容。
 
說句題外話,這個(gè)東西在1995年被Namco申請(qǐng)了專利O__O ” US Patent 5,718,632,好在這項(xiàng)專利在2015年已經(jīng)過期了……讀者如果有興趣可以閱讀對(duì)應(yīng)的資料,傳送門。
 
在UE4中的實(shí)現(xiàn)
 
以下的代碼是我在整理以前的代碼的時(shí)候翻出來的,參考來源忘了。如果讀者看到之后能給出來源我將不勝感激……
 
.h文件
 

[代碼]:

1 DECLARE_DYNAMIC_DELEGATE(FOnPackageLoaded);
2  
3     UFUNCTION(BlueprintCallable, meta = (WorldContext = "WorldContextObject"), Category = "TransitionLevel")
4     static bool LoadLevelAsync(const FString& InName, TArray<fstring> Packages, FOnPackageLoaded OnPackageLoaded);</fstring>
 
.cpp文件
 

[代碼]:

01 bool UMainFunctionLibrary::LoadLevelAsync(const FString& InName, TArray<fstring> Packages, FOnPackageLoaded OnPackageLoaded)
02 {
03     FTimerHandle* TimerHandle = nullptr;
04  
05     LoadPackageAsync(InName, FLoadPackageAsyncDelegate::CreateLambda([=](const FName& PackageName, UPackage* LoadedPackage, EAsyncLoadingResult::Type Result) {
06         OnPackageLoaded.ExecuteIfBound(); }),
07         0, PKG_ContainsMap);
08  
09     return true;
10 }</fstring>
 
代碼應(yīng)該比較好閱讀……這里就不再贅述了。比較推薦的方法是先載入對(duì)應(yīng)的子關(guān)卡和子資源,然后進(jìn)行Open Level/Travel Level…方法。
 
對(duì)應(yīng)思考
 
在我進(jìn)行對(duì)應(yīng)的實(shí)驗(yàn)過程中,發(fā)現(xiàn)在某些情況下還是出現(xiàn)瞬間的Hitch情況,幀率依然不穩(wěn)定。
 
此時(shí)的原因是由于在進(jìn)行Load Map的過程中存在著大量的I/O,如果出現(xiàn)單個(gè)資源文件太大(例如極高分辨率的貼圖等)的情況下,則會(huì)出現(xiàn)很嚴(yán)重的Hitch。
 
因此可以考慮將一些重要的資源分解為其他較小的資源,從而進(jìn)行異步讀取,這可能會(huì)是一個(gè)不錯(cuò)的處理方法。

相關(guān)文章
網(wǎng)友評(píng)論

您需要登錄后才可以發(fā)帖 登錄 | 立即注冊(cè)

關(guān)閉

全部評(píng)論:0條

推薦
熱門