• Unity构建详解(6)——SBP的Bundle写操作生成


    以下三个操作实际上是为了得到构建Bundle需要的其他参数,最关键的Bundle组装参数在上文已经说过了,至于这三个操作的具体细节不用过于追究,一般不怎么会取修改。

    这些参数采用命令模式被封装起来,这是常见的参数非常多的时候的处理方式。

    至于为什么要有这些参数,其实取决于后面的Writing Task

    【GenerateBundleCommands】

    • 对BuildContent.BundleLayout中的 每个Asset bundle创建对应的AssetBundleWriteOperation
      • 创建WriteCommand
        • 根据filename和WriteData.FileToObjects知道一个要写哪些Object
        • 将每个Object封装成SerializationInfo,其有两个字段
          • 一是Object对应的ObjectIdentifier
          • 一个是serializationIndex,表不同Object在File中的标识
      • 创建BuildUsageTagSet
        • 从DependencyData.AssetUsage获取每个Asset的Usage,然后Union
      • 创建BuildReferenceMap
        • referenceMap.AddMappings(command.internalName, command.serializeObjects.ToArray());
      • 创建DependencyHash
        • 从DependencyData.DependencyHash得到每个Asset的Hash128
        • 合起来再计算一次Hash   HashingMethods.Calculate(dependencyHashes).ToHash128()
      • 创建AssetBundleInfo
        • 得到bundleName
        • 从DependencyData.AssetInfo得到每个Asset对应的AssetLoadInfo
    • 对Scene Bundle中的创建SceneBundleWriteOperation
      • 创建WriteCommand
      • 创建BuildUsageTagSet
      • 创建BuildReferenceMap
      • 创建DependencyHash
      • 创建SceneBundleInfo:只有第一个场景有该参数
        • 得到bundleName
        • 对每个Scene引用的Asset创建SceneLoadInfo,其记录了三个信息
          • Scene的GUID、Scene的资源路径、Scene归属的内部文件名
      • 创建PreloadInfo
        • 场景的referencedObjects中有而File中没有的要预先加载
    • 填充WriteData
      • m_WriteData.WriteOperations.Add(operation);
      • m_WriteData.FileToUsageSet.Add(command.internalName, usageSet);
      • m_WriteData.FileToReferenceMap.Add(command.internalName, referenceMap);

    【GenerateSubAssetPathMaps】

    这里主要是为了处理BuildExtendedAssetData,创建对应的AssetLoadInfo

    • ExtendedAssetData.ExtendedData获取扩展数据的Asset的guid
    • 从WriteData.AssetToFiles[asset][0]获取该Asset要被写入哪个文件
    • 从WriteData.WriteOperations找到该文件对应的写操作
    • 从写操作中的AssetBundleInfo获取该Asset的AssetLoadInfo
    • 获取该Asset对应的扩展数据的Object,根据该Asset的AssetLoadInfo生成扩展的Object的AssetLoadInfo
    • 将生成的AssetLoadInfo放入写操作中的AssetBundleInfo中的AssetLoadInfoList中

    【GenerateBundleMaps】

    • 创建临时的map关系
      • 从WriteData.AssetToFiles获取该Asset对应的MainFile
      • 从DependencyData.AssetInfo和DependencyData.SceneInfo获取该Asset的referencedObjects
      • 进而得到MainFile的referencedObjects
      • 从WriteData.AssetToFiles获取该Asset的MainFile依赖的其他File
      • 获取其他File依赖的Asset
    • 填充BuildReferenceMaps,在GenerateBundleCommands只做了MainFile的,其他File没做
      • MainFile有自己全部的Object,不用引用其他的
      • 其他File引用的Object被剥离了,需要记录引用的哪个File中的哪个Object
        •  referenceMap.AddMapping(file, serializedObject.serializationIndex, serializedObject.serializationObject);
        • 注意区分File中Obejct的索引serializationIndex和Asset中Object的索引FileID
    • 填充BuildUsageTagSet
  • 相关阅读:
    vue-admin-better前端页面-菜单-权限配置
    C 、C++ 、Java、Python、JavaScript数据类型对比介绍
    扩散模型实战(十):Stable Diffusion文本条件生成图像大模型
    java-net-php-python-java西藏文库计算机毕业设计程序
    ubuntu 修改磁盘名称
    Vue3.0+小技巧
    游戏盾如何有效防护DDoS
    springboot和vue:十二、VueRouter(动态路由)+导航守卫
    手机和模拟器的 Frida 环境配置
    Redis的学习
  • 原文地址:https://blog.csdn.net/enternalstar/article/details/137179318