4.27 虚幻引擎最新的内容分发策略 Content Distribution
一. 打包过程总览 Package overview
我们首先看一下Unreal整体的打包流程。
- Build:最开始的关节是编译UAT的脚本,Compile AutomationScripts。之后我们要编译源代码,形成我们的可执行文件。
- Cook:我们分为两个阶段,
- Cook 的第一个阶段Content Cook,这个阶段主要是把资产内容转化为目标平台所支持的资产格式。
- Stage:为了distribution/execution,进行排序并且组织的文件。我们将多个asset资产进行Bunding创建一个或多个“.pak”文件。并且我们将进行Pak的压缩,之后我们将进行可执行文件的签名。
- Package:更改为public distribution 或者 testable form。
- Archive:存储归档
- Deploy: 上传到设备、文件服务器等
对于分发,虚幻引擎可以将内容分割成 .pak 文件并将其与主要可执行文件分开交付给用户。引擎支持DCL和Patch。因此我们有三种基础方案:
- Release
- 可执行文件 +Prerequisite+最小内容
- Ex.APK和APK内的OBB
- Patch:进行和 Release的更改比较 + added assets
- DLC (DLC build):release+新的版本
一直打Patch 的方案有很大的问题,我们需要适合频繁更改/添加资源的网络游戏的方法!
- 创建Chunk,通过ChunkID分隔资源,使其成为多个Chunk,利用UnrealPak程序
- 创建HTTP Chunk安装数据:将Chunk分成适合作为HTTP通信部署的大小(默认为1MB),利用构建修补程序工具,将结果(分叉的Chunk+Manifest)上传到CDN。仅自动下载客户端所需的部分,然后重新生成Pak。
Chunk创建+HTTP Chunk安装数据的限制:
- 本地重新生成Pak:Pak越大,再生成本成倍增加。
- 网络流量管理难:影响因素多,如何拆分和导出数据很难掌握。
- Pak版本控制难点:需要单独管理当前版本的Pak列表。
- 在过去是专门为非常不稳定的移动网络用户设计
最新的内容分发解决方案:
- Chunk Downloader
- Google PAD
二.Chunk Downloader[4.26]
下载多个区块的功能“适合发布大量小文件的游戏”可以直接管理每个Patch版本的PAK列表,这是非常直观的。主要功能是:继承和PAK版本控制。
Chuck Downloader首先从Web服务器将清单中的包列表与本地进行比较,下载清单文件,然后下载新的或更新的包文件。
- 首先我们启用ChunkDownloader plugin
- 添加module 依赖到 project.Build.cs
- 重新的generate
需要配置的信息是: $NUM_ENTRIES, BUILD_ID, PAK信息 PAK 信息: file name, size (bytes), version, Chuck number, relative path。
服务器设置: 链接一个Web服务器到 DefaultGame.ini
- 启用InternetInformationServices进行本地测试
- 添加用于本地测试的MIMEtype:.pak扩展名
=application/octet-stream
我们要在Gameinstance中进行实现,FChunkDownloader is Single-tone (without threadsafe)。
详情请看官网。
三.Google PAD [4.25+]
GooglePlay提供仅限安卓的内容分发解决方案,与AndroidAppBundle一起使用。优点是自动更新单个release artifact,非常的灵活,可以设置纹理压缩格式目标。
UE4.25里有,但是最先的发布版在beta在 4.26里面。
传统的packaging
- APK + APK Extension File (.obb)
- 主 obb 文件和 patch obb 文件, 每个2GB
- 其余的Pak文件由用户自行部署
- CDN部署
- 直接包部署vs.UE交付的内容部署解决方案
- HTTP Chuck安装程序
- Chuck Downloader
Dynamic delivery via the AAB
建立 AssetPack。AAB中存在多个AssetPack“根据DeliveryMode限制有不同的容量和数量。
- Install-Time::每个项目1个.默认区块。无其他设置默认,obb文件自动包含在AssetPack中。
- Fast-Follow:每个项目1个
- Pak必须放在一个文件夹中
- 路径:
Build/Android/gradle/assetpacks/fast-follow/{AssetPackxxx}/src/main/assets
- AssetPack xxx:名称不能重复
- On-Demand:多个
- 您必须将Pak分解到多个文件夹中
- 路径:Build/Android/gradle/assetpacks/on-demand/{AssetPackxxx}/src/main/asset
- AssetPackxxx:根据{AssetPackxxx}分为多个AssetPack。 不能重复名称.
Google PAD使用
引擎提供GooglePAD FunctionLibrary,为AssetPack提供有用的API
- 错误处理:EGooglePADErrorCode
- 检查AssetPack是否已访问/下载
- “启动/取消下载”(RequestCancel)Download
- 查看下载状态:GetDownloadState
- 删除AssetPack:RequestRemoval
Google PAD使用问题
- 如果构建失败,
- 4.26热修复期间更改平台SDK
- 使用AndroidStudio4.0或更高版本/NDKr21e
- 要使用GooglePAD,请按照4.27发布说明中的要求进行操作
- 从OBB文件中删除Chunk
- 当包含非Install-time Pak时进行筛选
- wildcard支持
- 如果您正在使用GooglePAD并查找Obb文件,请关闭Build for Testing中的OnlyDistribution选项
四.新增减少包体的策略
我们通常减少包体最常见的方法如下:
- 压缩已Cook内容
- 共享材质着色器和库
- 排除编辑器内容
- 设置项目的关卡
- 选择要打包和不打包的内容
- 检查将要Cook的内容
- 逐设备纹理LOD
- 删除未使用内容/插件
- 设置打包黑名单
- 设置最大可移动光源/点光源数
- 用隐藏符号进编译
Create compressed cooked packages
在[4.27+]中,我们可以选择创建压缩的Cook Package,设置压缩策略,最大压缩率等等。这个选项在[4.27+]中是默认开启的,因此我们只要是4.27的引擎就能有收益。项目APK包的容量通常会削减50%左右!
压缩格式有Kraken,Mermaid,Selkie,Leviathan可以选择。基于压缩率/解码时间确定编解码器。例如-compressionChucksize=1MB
,-asynccompression
。
Bink Video [4.27 +]
这是一个针对视频的包体优化方案。新方案解码速度是之前的十倍,内存减少了8~16倍,并且是硬件辅助加载。使用Penker编解码器进行压缩。我们可以在下面找到对应的工具!
启用 Bink Media 插件,并且使用 BinkMediaPlayer播放视频。
五.Android开发 Tips
ADGE [4.27+]
我们可以使用Android Game Development Extension for Visual Studio plugin的插件,它可以很方便的在VS种进行Debug。
可以在这里找到 https://developer.android.com/games/agde
Android PGO 支持[4.27+]
PGOProfile/PGOOptimize
安卓 AddressSanitizer[4.27+]
支持APILevel27(armv7,arm64)在Arm64设备上安装自定义固件,以利用基于硬件的hardware ASan。