前言
引擎版本 UE 5.32源码
需求:原生UE热更流程
整体流程
- 资源划分
- 服务器部署和ChunkDownloader
- 基础包和热更包构建
- 下载验证
资源划分
将资源按规则进行划分,可以降低热更时的下载量。
Uasset资源
第一种是在ProjectSettings中进行配置
第二种是创建Primary Asset Labels
设置priority chunkID 等属性
可以在AssetAudit中查看划分结果
非Uasset资源
UE并没有提供 Non-Asset 划分 Chunk 的方式,但可以通过PakFileRules.ini 配置打包规则,实现把Lua脚本等非UAsset的资源打入指定Chunk包的需求,具体可以看我的另一篇文章
https://blog.csdn.net/weixin_38377747/article/details/137108126?spm=1001.2014.3001.5501
服务器部署和ChunkDownloader
热更包构架完毕后需要部署到服务器上,来测试下载。热更下载的方式本文采用chunkDownloader,官网文档中对于服务器部署和chunkdownloader的使用方式有详细介绍(有小坑,可以参考第二篇文章),这里不详细说明,只做一些细节提示。
https://dev.epicgames.com/documentation/en-us/unreal-engine/implementing-chunkdownloader-in-your-gameplay-in-unreal-engine
https://zhuanlan.zhihu.com/p/401132377
部署的文件夹结构为
-
DeploymentName ----最外层,对应文档的PatchingDemoCDN(可理解为分支)
-
ContentBuildId ---- 其实就是版本号
-
Windows ----存放对应系统的pak包的文件夹
-
pakchunk0-Windows.pak ----若干对应版本的pak包
-
BuildManifest-PlatformName.txt ----描述文件,用来对比和下载Pak包
BuildManifest文件的内容很重要
NUM_ENTRIES 是pak包的个数,可以和基础包数量不一样
BUILD_ID是版本号 要跟上级文件夹一致
内容是pak包名称 pak包大小 版本号 _p计数 存放路径
需注意中间的空白不是空格 是Tab
配置 CDN Base Urls
在DefaultGam.ini中增加
[/Script/Plugins.ChunkDownloader ]
可以配置多条 不同的DeploymentName1对应不同的分支
[/Script/Plugins.ChunkDownloader <DeploymentName1>]
+CdnBaseUrls=<BaseUrl1>
+CdnBaseUrls=<BaseUrl2>
[/Script/Plugins.ChunkDownloader <DeploymentName2>]
+CdnBaseUrls=<BaseUrl3>
+CdnBaseUrls=<BaseUrl4>
ChunkDownloader
核心方法:
- Downloader->Initialize(“Windows”, 8); 这一步拼接了BuildManifest-PlatformName中的PlatformName
- Downloader->LoadCachedBuild(DeploymentName);尝试从本地加载对应pak包,可以用来判断是否需要下载
- Downloader->UpdateBuild(DeploymentName, ContentBuildId, CallbackFunction);开始进行下载
- Downloader->BeginLoadingMode(LoadingModeCompleteCallback);监听下载过程
- Downloader->MountChunks(DownloadedChunks, MountCompleteCallback);挂载Pak,需要传入ChunkId数组
下载后的文件默认存放在Saved\PersistentDownloadDir\PakCache下,其中还有一个CachedBuildManifest描述文件,上面的LoadCachedBuild方法就是尝试读取这个文件。
基础包和热更包构建
使用projectlaunncher进行打包
新建一个LaunchProfiles,Cook选择By the book,勾选要cook的平台和语言
重点设置在Relase/DLC/Patching Settings和 Advanced Settings中
基础包
热更包
其他设置这样就可以
这样打包完后在项目文件夹下会生产Releases文件夹,其中有对应你版本号的文件夹
打出来的pakchunk包都在基础文件夹中(这一点有些奇怪,我觉得对应版本的pak包应该在对应版本文件夹,不知道是哪里出了问题)
把其中热更的pak包复制到服务器对应版本的文件夹下,再配置好BuildManifest的内容,热更的准备工作就结束了。
下载验证
如果客户端热更失败,重点排查一下几点:
- 服务器部署的文件结构,BuildManifest的内容 版本号是否正确
- 部署的URL能否正常访问
- CDN Base Urls配置是否正确
顺利的话热更后我们会在打包后的项目 Saved\PersistentDownloadDir\PakCache下看到这些文件
官方流程中在下载完成后通过Downloader->MountChunks来进行了Pak的挂载。
因为引擎默认的挂载Pak包路径是这三个
- Contnet/Paks
- Engine/Content/Paks
- Saved/Paks
所以如果不走这个流程的话,热更的pak包是不会挂载的。如果想自动挂载的话,除了复制到Contnet/Paks下还可以使用-pakdir=的命令行来增加挂载目录(只能在非shipping模式下使用)
到这里一个简单的原生UE热更新流程就完成了,其中还有很多值得优化的地方,比如自动化生产BuildManifest的工具等。
UE持续学习中,欢迎大佬指正错误之处。
个人实践记录,未经同意谢绝转载谢谢!
参考
https://zhuanlan.zhihu.com/p/401132377
https://zhuanlan.zhihu.com/p/523509674
https://dev.epicgames.com/documentation/en-us/unreal-engine/implementing-chunkdownloader-in-your-gameplay-in-unreal-engine
https://blog.csdn.net/acdfg123/article/details/128024036
https://blog.csdn.net/xiao__sha/article/details/127089373