如何在Unity上开发Nintendo(任天堂)Switch平台游戏时让游戏patch包大小尽量小
众所周知,Nintendo Switch有一条guidline-0123来限制游戏的patch包大小上限是512MiB。
如果你的游戏是使用Unity开发的,只要你不正确合理的使用Assets Bundle/Addressable Assets的话,你将会得到一个包体很大的patch包。
首先,你应该需要了解Nintendo Switch的patching system机制:
Nintendo Switch使用的是基于16字节块二进制匹配的增量打补丁机制。换句话说,如果它找到二进制块完全匹配的话,它将继续使用来自初始的ROM包里的老data;在patch包里仅会包括新版本和初始版本的不同数据块。
所以你需要尽可能的去遵循这条规则,以确保你打出的patch包大小尽可能的小。
我还得指出一点,在打patch包的时候Unity它自己的一些东西的改动会占用patch包32MiB(Unity2020.1以后大约是27.16MiB)的大小。这就只给游戏留下了480MiB(Unity2020.1以后大约485MiB)的大小patch空间。
以下是一些让游戏打出来的patch包大小尽量小的建议:
- 除非你的游戏永远不会超过512MiB,那么你就不要把Build Settings->Compression Method设置成除Default以外的其他设置。
- 使用Assets Bundle/Addressable Assets来动态加载scenes资源,而不要用整个完整的scenes bundle。
- 尽量让游戏的第一个scene足够“轻”来缩短游戏从启动到第一帧被绘制出来的时间。你可以把较“重”的scenes分解成多个小的较“轻”的scenes,然后使用异步的加载它们(可以使用LoadSceneMode.Additive)。
- 你应该控制你划分Assets Bundle/Addressable Assets粒度大小。如果划分的太大,任何一个Asset的改动就不能很好的隔离在一个较小的范围内;如果划分的太小,游戏将需要花更多的时间从硬盘上去加载它们。
- 在游戏发布以后就不要rebuild或修改asset bundle/asset group。如果对于修改的resources你只是简单的新增一个新的asset bundle/group并且从这里提取它们而不是从老的bundle里,那你将会获得一个更小的patch包。
- 将那些可能发生改变的resources和那些不会发生改变的隔离开。
- 如果你必须修改那些存在已发布的assets bundle里的assets的话,一种最有效地方法是把那么需要修改的assets放到一个新的bundle里,但是这种方法需要手动的加载和卸载这些新的变异的bundle和assets。幸运的是,Unity从2018.2以后新增了 Addressable Assets让这个过程变简单了。
- 如果你使用Assets Bundles,建议你使用ChunkBasedCompression(LZ4)压缩选项来提高加载时间和缩小patch尺寸。
- 如果你使用Addressable Assets,建议你使用LZ4压缩来提高加载时间和缩小patch尺寸(在Unity2020.1以后,如果你的游戏加载时间是可以接受的话,建议尝试使用不压缩Assets groups)。
- 一定不要使用LZMA压缩来压缩addressable asset groups。
- 如果你使用Addressable Assets,在AddressableAssetSettings里关掉Log Runtime Exceptions选项。
- 当你在游戏build里配置有asset group,确保设置Bundle Naming为FileName或者Use Hash of Filename。其他选项将会改变bundle的名字如果你改变该asset group里的任何asset。
- 如果你知道那些可能发生改变的assets,把它们分别放到不同的assets groups或者把它们整合到一个单独的assets group,并且把Bundle Mode设置成Pack Separetely。
- 使用Addressables Analyze功能来找出那些被包含在多个asset groups里的冗余assets。
以下是使用Addressables Analyze功能的示例。
Addressables Analyze窗口:

重新打开以后,就会有一个新的名叫Duplicate Asset Isolation的group。它包含了所有被包含在多个asset groups里的冗余assets。

以下是一个建议在AddressableAssetSettings里asset groups的配置示例:


在你提交游戏初始Nintendo ROM前,尝试修改一个你认为以后可能会改变的asset,然后创建一个patch,并且使用AuthoringEditor或者AuthoringTool.exe来分析这个patch来看看你的游戏现在是否在assets管理方面足够好!


你也可以使用AuthoringTool的"list"命令来列出你的.NSP文件里包含了些什么东西。并且你可以加上 --patched-only-in-detail命令选项来查看哪些文件是在patch包里,哪些文件在初始的ROM包里。
%NINTENDO_SDK_ROOT%\Tools\CommandLineTools\AuthoringTool\AuthoringTool.exe
list (your patch.nsp) --original (your initial.nsp) --patched-only-in-detail
C:\WINDOWS\system32>%NINTENDO_SDK_ROOT%\Tools\CommandLineTools\AuthoringTo
ol\AuthoringTool.exe list modified_asset_patch.nsp --original original_v0.nsp --patched-only-indetail
add4524cd2c89a9865b182be6f8f9893.nca (55465472 byte<
优化Unity在Nintendo Switch上的游戏patch包大小策略

本文详细介绍了如何在使用Unity开发Nintendo Switch游戏时,通过理解Switch的patch系统机制、合理运用AssetsBundle/AddressableAssets,以及调整资源管理策略,来减小游戏patch包的大小。建议包括避免不必要的压缩设置,使用动态加载场景,精细控制AssetsBundle粒度,以及利用AddressablesAnalyze工具分析冗余资源等。同时,提供了分析patch包内容的命令行工具使用方法,以确保游戏patch包的高效管理。
最低0.47元/天 解锁文章
4万+

被折叠的 条评论
为什么被折叠?



