UnrealEngine4異步加載關(guān)卡的實現(xiàn)方法及思考
來源:
52vr |
責任編輯:傳說的落葉 |
發(fā)布時間: 2019-06-13 08:15 | 瀏覽量:
這篇文章介紹了在UE4中實現(xiàn)異步加載關(guān)卡的方法,以及我對應的思考。
背景
在很多游戲中都有用到關(guān)卡的異步加載,關(guān)卡的異步加載指的是在游戲的某個階段,使用多線程的方法進行新關(guān)卡對應的內(nèi)容加載。從而能夠免去直接的Loading階段,提升游戲體驗的效果。
目前這種方法被廣泛運用于各種游戲,例如在游戲戰(zhàn)神Ⅲ中,主角有時會走過一段長長的山道,在此時實際上游戲就已經(jīng)在開始加載下一個關(guān)卡了(當主角走出山道時如果還沒有加載完,則會顯示Loading界面);又例如在游戲暗黑血統(tǒng)Ⅱ中,主角解開謎題從一個房間進入下一個房間時,往往會有一段比較長時間的推門動作,此時也是在進行對應關(guān)卡的加載……
Transition Map與異步加載關(guān)卡的異同
有人可能會將Transition map和異步加載關(guān)卡混為一談,但實際上這兩者是不一樣的。異步加載關(guān)卡指的是在當前的主關(guān)卡中,使用其他線程進行內(nèi)容的加載。而Transition Map指的是在需要進行加載時,給玩家一個幾乎瞬間就能加載完的關(guān)卡,這個關(guān)卡可能含有一些小游戲或者訓練內(nèi)容。
說句題外話,這個東西在1995年被Namco申請了專利O__O ” US Patent 5,718,632,好在這項專利在2015年已經(jīng)過期了……讀者如果有興趣可以閱讀對應的資料,傳送門。
在UE4中的實現(xiàn)
以下的代碼是我在整理以前的代碼的時候翻出來的,參考來源忘了。如果讀者看到之后能給出來源我將不勝感激……
.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> |
代碼應該比較好閱讀……這里就不再贅述了。比較推薦的方法是先載入對應的子關(guān)卡和子資源,然后進行Open Level/Travel Level…方法。
對應思考
在我進行對應的實驗過程中,發(fā)現(xiàn)在某些情況下還是出現(xiàn)瞬間的Hitch情況,幀率依然不穩(wěn)定。
此時的原因是由于在進行Load Map的過程中存在著大量的I/O,如果出現(xiàn)單個資源文件太大(例如極高分辨率的貼圖等)的情況下,則會出現(xiàn)很嚴重的Hitch。
因此可以考慮將一些重要的資源分解為其他較小的資源,從而進行異步讀取,這可能會是一個不錯的處理方法。
-
分享到:
相關(guān)文章
網(wǎng)友評論
全部評論:0條
推薦
熱門