如何在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)
dabf0ac9b8c30e698fbb6e1d15662186.nca (143872 byte)
6ab0afdb77c658f511381977cd4ded79.cnmt.nca (3584 byte)
6ab0afdb77c658f511381977cd4ded79.cnmt.xml (2358 byte)
add4524cd2c89a9865b182be6f8f9893.programinfo.xml (154777 byte)
dabf0ac9b8c30e698fbb6e1d15662186.raw.AmericanEnglish.jpg (172759 byte)
dabf0ac9b8c30e698fbb6e1d15662186.nx.AmericanEnglish.jpg (41328 byte)
dabf0ac9b8c30e698fbb6e1d15662186.nacp.xml (12199 byte)
01004b9000490800000000000000000a.tik (704 byte)
01004b9000490800000000000000000a.cert (1792 byte)
cardspec.xml (193 byte)
authoringtoolinfo.xml (449 byte)
---------------------------------------------**
add4524cd2c89a9865b182be6f8f9893.nca/fs0/main (19769316 byte)
add4524cd2c89a9865b182be6f8f9893.nca/fs0/main.npdm (1540 byte)
add4524cd2c89a9865b182be6f8f9893.nca/fs0/rtld (6790 byte)
add4524cd2c89a9865b182be6f8f9893.nca/fs0/sdk (5372429 byte)
add4524cd2c89a9865b182be6f8f9893.nca/fs0/subsdk0 (3522324 byte)
add4524cd2c89a9865b182be6f8f9893.nca/fs1/Data/globalgamemanagers (58800 byte)
[Original]
(offset, size)(0, 31024), (31056, 27744)
[Patch]
(offset, size) = (31024, 32)
add4524cd2c89a9865b182be6f8f9893.nca/fs1/Data/level0 (6771144 byte)
[Original]
(offset, size)(0, 5647200), (5668464, 1057376), (6725872, 45272)
[Patch]
(offset, size) = (5647200, 21264), (6725840, 32)
add4524cd2c89a9865b182be6f8f9893.nca/fs1/Data/sharedassets0.assets (28736932 byte)
[Original]
(offset, size)(0, 11184), (12240, 15489792), (15502432, 12222736), (27727424, 1009508)
[Patch]
(offset, size) = (11184, 1056), (15502032, 400), (27725168, 2256)
add4524cd2c89a9865b182be6f8f9893.nca/fs1/Data/sharedassets0.assets.resS (199614828
byte)
[Original]
(offset, size)(0, 172802592), (177005056, 62672), (179801280, 52192), (185339296, 91536),
(185443936, 57968), (188189920, 64496), (190986144, 64496)
[Patch]
(offset, size) = (172802592, 4202464), (177067728, 2733552), (179853472, 5485824),
(185430832, 13104), (185501904, 2688016), (188254416, 2731728), (191050640, 8564188)
dabf0ac9b8c30e698fbb6e1d15662186.nca/fs0/control.nacp (16384 byte)
dabf0ac9b8c30e698fbb6e1d15662186.nca/fs0/icon_AmericanEnglish.dat (41328 byte)
6ab0afdb77c658f511381977cd4ded79.cnmt.nca/fs0/Patch_01004b9000490800.cnmt (356
byte)