码迷,mamicode.com
首页 > 其他好文 > 详细

Unreal Engine 4 —— 异步加载关卡的实现方法及思考

时间:2017-03-16 21:33:04      阅读:315      评论:0      收藏:0      [点我收藏+]

标签:申请   create   stat   sync   amp   开始   nes   table   重要   

技术分享

 
这篇文章介绍了在ue4中实现异步加载关卡的方法,以及我对应的思考。
 
背景
 
在很多游戏中都有用到关卡的异步加载,关卡的异步加载指的是在游戏的某个阶段,使用多线程的方法进行新关卡对应的内容加载。从而能够免去直接的Loading阶段,提升游戏体验的效果。
 
目前这种方法被广泛运用于各种游戏,例如在游戏战神Ⅲ中,主角有时会走过一段长长的山道,在此时实际上游戏就已经在开始加载下一个关卡了(当主角走出山道时如果还没有加载完,则会显示Loading界面);又例如在游戏暗黑血统Ⅱ中,主角解开谜题从一个房间进入下一个房间时,往往会有一段比较长时间的推门动作,此时也是在进行对应关卡的加载……
 
Transition Map与异步加载关卡的异同
 
有人可能会将Transition map和异步加载关卡混为一谈,但实际上这两者是不一样的。异步加载关卡指的是在当前的主关卡中,使用其他线程进行内容的加载。而Transition Map指的是在需要进行加载时,给玩家一个几乎瞬间就能加载完的关卡,这个关卡可能含有一些小游戏或者训练内容。
 
说句题外话,这个东西在1995年被Namco申请了专利O__O ” US Patent 5,718,632,好在这项专利在2015年已经过期了……读者如果有兴趣可以阅读对应的资料,传送门。
 
在UE4中的实现
 
以下的代码是我在整理以前的代码的时候翻出来的,参考来源忘了。如果读者看到之后能给出来源我将不胜感激……
 
.h文件
 

[代码]:

1 DECL<a href="http://www.52vr.com/armr/" style="font-weight: bold;color: ;" target="_blank">AR</a>E_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>
 
代码应该比较好阅读……这里就不再赘述了。比较推荐的方法是先载入对应的子关卡和子资源,然后进行Open Level/Travel Level…方法。
 
对应思考
 
在我进行对应的实验过程中,发现在某些情况下还是出现瞬间的Hitch情况,帧率依然不稳定。
 
此时的原因是由于在进行Load Map的过程中存在着大量的I/O,如果出现单个资源文件太大(例如极高分辨率的贴图等)的情况下,则会出现很严重的Hitch。
 
因此可以考虑将一些重要的资源分解为其他较小的资源,从而进行异步读取,这可能会是一个不错的处理方法。
 

<全文完>

 

作者:谁允许你直视本大叔的

 

本文转自:52VR.com  Unreal Engine 4 http://www.52vr.com/article-881-1.html

Unreal Engine 4 —— 异步加载关卡的实现方法及思考

标签:申请   create   stat   sync   amp   开始   nes   table   重要   

原文地址:http://www.cnblogs.com/mantouyefan/p/6561504.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!