Contents

4.27 虚幻引擎最新的内容分发策略 Content Distribution

一. 打包过程总览 Package overview

我们首先看一下Unreal整体的打包流程。

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture![20220217133416](httpspapalqiblog.oss-cn-beijing.aliyuncs.comblogpicture20220217133416.png).png

  1. Build:最开始的关节是编译UAT的脚本,Compile AutomationScripts。之后我们要编译源代码,形成我们的可执行文件。
  2. Cook:我们分为两个阶段,
    1. Cook 的第一个阶段Content Cook,这个阶段主要是把资产内容转化为目标平台所支持的资产格式。
    2. Stage:为了distribution/execution,进行排序并且组织的文件。我们将多个asset资产进行Bunding创建一个或多个“.pak”文件。并且我们将进行Pak的压缩,之后我们将进行可执行文件的签名。
  3. Package:更改为public distribution 或者 testable form。
  4. Archive:存储归档
  5. Deploy: 上传到设备、文件服务器等

对于分发,虚幻引擎可以将内容分割成 .pak 文件并将其与主要可执行文件分开交付给用户。引擎支持DCL和Patch。因此我们有三种基础方案:

  1. Release
    1. 可执行文件 +Prerequisite+最小内容
    2. Ex.APK和APK内的OBB
  2. Patch:进行和 Release的更改比较 + added assets
  3. DLC (DLC build):release+新的版本

一直打Patch 的方案有很大的问题,我们需要适合频繁更改/添加资源的网络游戏的方法!

  1. 创建Chunk,通过ChunkID分隔资源,使其成为多个Chunk,利用UnrealPak程序
  2. 创建HTTP Chunk安装数据:将Chunk分成适合作为HTTP通信部署的大小(默认为1MB),利用构建修补程序工具,将结果(分叉的Chunk+Manifest)上传到CDN。仅自动下载客户端所需的部分,然后重新生成Pak。

Chunk创建+HTTP Chunk安装数据的限制:

  1. 本地重新生成Pak:Pak越大,再生成本成倍增加。
  2. 网络流量管理难:影响因素多,如何拆分和导出数据很难掌握。
  3. Pak版本控制难点:需要单独管理当前版本的Pak列表。
  4. 在过去是专门为非常不稳定的移动网络用户设计

最新的内容分发解决方案:

  1. Chunk Downloader
  2. Google PAD

二.Chunk Downloader[4.26]

下载多个区块的功能“适合发布大量小文件的游戏”可以直接管理每个Patch版本的PAK列表,这是非常直观的。主要功能是:继承和PAK版本控制。

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218213738.png

Chuck Downloader首先从Web服务器将清单中的包列表与本地进行比较,下载清单文件,然后下载新的或更新的包文件。

  1. 首先我们启用ChunkDownloader plugin
  2. 添加module 依赖到 project.Build.cs
  3. 重新的generate

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218213904.png

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218213910.png

需要配置的信息是: $NUM_ENTRIES, BUILD_ID, PAK信息 PAK 信息: file name, size (bytes), version, Chuck number, relative path。

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218214017.png

服务器设置: 链接一个Web服务器到 DefaultGame.ini

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218214116.png

  1. 启用InternetInformationServices进行本地测试
  2. 添加用于本地测试的MIMEtype:.pak扩展名=application/octet-stream

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218214237.png

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218214249.png

我们要在Gameinstance中进行实现,FChunkDownloader is Single-tone (without threadsafe)。

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218214506.png

详情请看官网。

三.Google PAD [4.25+]

GooglePlay提供仅限安卓的内容分发解决方案,与AndroidAppBundle一起使用。优点是自动更新单个release artifact,非常的灵活,可以设置纹理压缩格式目标。

UE4.25里有,但是最先的发布版在beta在 4.26里面。

传统的packaging

  1. APK + APK Extension File (.obb)
    1. 主 obb 文件和 patch obb 文件, 每个2GB
  2. 其余的Pak文件由用户自行部署
    1. CDN部署
    2. 直接包部署vs.UE交付的内容部署解决方案
      1. HTTP Chuck安装程序
      2. Chuck Downloader

Dynamic delivery via the AAB

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218215241.png

建立 AssetPack。AAB中存在多个AssetPack“根据DeliveryMode限制有不同的容量和数量。

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218220520.png

  1. Install-Time::每个项目1个.默认区块。无其他设置默认,obb文件自动包含在AssetPack中。
  2. Fast-Follow:每个项目1个
    1. Pak必须放在一个文件夹中
    2. 路径:Build/Android/gradle/assetpacks/fast-follow/{AssetPackxxx}/src/main/assets
    3. AssetPack xxx:名称不能重复
  3. On-Demand:多个
    1. 您必须将Pak分解到多个文件夹中
    2. 路径:Build/Android/gradle/assetpacks/on-demand/{AssetPackxxx}/src/main/asset
    3. AssetPackxxx:根据{AssetPackxxx}分为多个AssetPack。 不能重复名称.

Google PAD使用

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218220059.png

引擎提供GooglePAD FunctionLibrary,为AssetPack提供有用的API

  1. 错误处理:EGooglePADErrorCode
  2. 检查AssetPack是否已访问/下载
  3. “启动/取消下载”(RequestCancel)Download
  4. 查看下载状态:GetDownloadState
  5. 删除AssetPack:RequestRemoval

Google PAD使用问题

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218215824.png

  1. 如果构建失败,
    1. 4.26热修复期间更改平台SDK
    2. 使用AndroidStudio4.0或更高版本/NDKr21e
    3. 要使用GooglePAD,请按照4.27发布说明中的要求进行操作
  2. 从OBB文件中删除Chunk
    1. 当包含非Install-time Pak时进行筛选
    2. wildcard支持
  3. 如果您正在使用GooglePAD并查找Obb文件,请关闭Build for Testing中的OnlyDistribution选项

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218215513.png

四.新增减少包体的策略

我们通常减少包体最常见的方法如下:

  1. 压缩已Cook内容
  2. 共享材质着色器和库
  3. 排除编辑器内容
  4. 设置项目的关卡
  5. 选择要打包和不打包的内容
  6. 检查将要Cook的内容
  7. 逐设备纹理LOD
  8. 删除未使用内容/插件
  9. 设置打包黑名单
  10. 设置最大可移动光源/点光源数
  11. 用隐藏符号进编译

Create compressed cooked packages

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218211539.png

在[4.27+]中,我们可以选择创建压缩的Cook Package,设置压缩策略,最大压缩率等等。这个选项在[4.27+]中是默认开启的,因此我们只要是4.27的引擎就能有收益。项目APK包的容量通常会削减50%左右!

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218212220.png

压缩格式有Kraken,Mermaid,Selkie,Leviathan可以选择。基于压缩率/解码时间确定编解码器。例如-compressionChucksize=1MB,-asynccompression

Bink Video [4.27 +]

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218213130.png

这是一个针对视频的包体优化方案。新方案解码速度是之前的十倍,内存减少了8~16倍,并且是硬件辅助加载。使用Penker编解码器进行压缩。我们可以在下面找到对应的工具!

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218213003.png

启用 Bink Media 插件,并且使用 BinkMediaPlayer播放视频。

五.Android开发 Tips

ADGE [4.27+]

我们可以使用Android Game Development Extension for Visual Studio plugin的插件,它可以很方便的在VS种进行Debug。

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218210619.png

可以在这里找到 https://developer.android.com/games/agde

Android PGO 支持[4.27+]

PGOProfile/PGOOptimize

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218210730.png

安卓 AddressSanitizer[4.27+]

支持APILevel27(armv7,arm64)在Arm64设备上安装自定义固件,以利用基于硬件的hardware ASan。

https://papalqiblog.oss-cn-beijing.aliyuncs.com/blog/picture20220218210543.png