UnrealEngine4異步加載關(guān)卡的實(shí)現(xiàn)方法及思考
來源:
52vr |
責(zé)任編輯:傳說的落葉 |
發(fā)布時(shí)間: 2019-06-13 08:15 | 瀏覽量:
這篇文章介紹了在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)閉
- 用戶名:
- 密 碼:
- 驗(yàn)證碼:
看不清? 點(diǎn)擊更換
- 忘記密碼?
全部評(píng)論:0條
推薦
熱門
- Unity插件綜合教程
- ZBrush水族女王完全雕刻
- UGUI動(dòng)態(tài)生成列表功能
- Unity 項(xiàng)目教程集合
- 3D MAX基礎(chǔ)教程視頻(含源
- zbrush制作小火龍教程
- 360、720全景圖視頻教程
- 用maya、Zbrush制作高精度虛擬人物模型

<p>《工業(yè)創(chuàng)意設(shè)計(jì)理論與實(shí)踐》適用于工業(yè)設(shè)計(jì)類專業(yè)研究...