这里说的Task不算是真正SBP管线里的了,而是Addressable中自定义的,包括之前的GenerateLocationListsTask和Post Processing AssetBundles都是在Addressable中的。一般使用SBP时都会用上Addressable。
【BuildLayoutGenerationTask】
这个Task是为了生成详细的打包结果,可以看到Bundle的总数、总大小,每个Bundle的大小、包含的Asset及其大小等信息,被保存在buildlayout.txt文件中。
具体是什么样的,打包一次,打开看看这个文件就知道了,不必多说。
这种写文件的Task都可以修改成多线程的
【GenerateCatalog】
Catalog是与Addressable相适配的,Addressable在初始化时就会加载Catelog文件,该文件记录了Bundle之间的依赖关系及其包含的Asset,可以认为是一个简化版的buildlayout,其只包含了运行时所需要知道的必要信息。可以根据项目需要添加新的信息。
Catalog有json文本格式和二进制格式两个版本,这里应该有一个常识,在真机上运行时的要读取的文件都要是二进制格式的,不要搞文本格式。
生成Catalog时有个是否把Catalog打入Bundle的选项,其会又走一遍打包流程,一般来说没有必要。
Catalog有优化,但Unity本身做的优化并不够,还需要单独做优化的,这本质上就是如何优化字符串内存。
如果仅仅是SBP,会生成一份Manifest文件,和BuildInt的流程相似,但该文件没有Catalog的信息多。
【GenerateLinkXml】
link.xml是代码裁剪时需要读取的文件,该文件以XML格式记录了需要保留的程序集、类型和成员。详细的在构建时再说。
- Link生成:
- UnityEditor.Build.Pipeline.Utilities.LinkXmlGenerator.CreateDefault()
- SBP中包含的Type
- WriteResult中包含的Type
- linker.AddTypes(resultValue.includedTypes);
-
linker.AddSerializedClass(writeResult.Value.includedSerializeReferenceFQN);
- WriteResult中包含的Type
-
Addressable中新增的Type
- 程序集添加:
- linker.AddAssemblies(new[] { typeof(Addressables).Assembly, typeof(UnityEngine.ResourceManagement.ResourceManager).Assembly });
- Type添加
- m_Linker.AddTypes(runtimeData.CertificateHandlerType);
- 各种Provider的Type,包括ResourceProvider、InstanceProvider、SceneProvider、InitializationDataProvider、自定义的Provider
- 程序集添加:
至此,SBP的打包介绍完毕