专业网站开发哪家专业,电商数据统计网站,那曲网站建设罗斯,企业自建电商平台有哪些【前置知识】
先要搞清楚Asset和Object的关系#xff0c;可以简单理解为一个Asset对应多个Object。
unity自定义的Asset也要有一个存储的标准#xff0c;其采用的是YAML#xff0c;我们看到的所有Unity自定义的Asset格式#xff0c;例如.prefab#xff08;预制体#x…【前置知识】
先要搞清楚Asset和Object的关系可以简单理解为一个Asset对应多个Object。
unity自定义的Asset也要有一个存储的标准其采用的是YAML我们看到的所有Unity自定义的Asset格式例如.prefab预制体.scene场景文件.asset资源文件例如ScriptableObject.mat材质球.controller动画状态机还有图集等。
例如prefab文件用YAML的格式记录了该Asset包含的Object每个Object有一个FileID用于区分Asset内的Object每个Object中会记录自身的属性信息、包含的Type、引用的其他Object、引用的其他Asset、引用的其他Asset的Object等信息。
ObjectIdentifier是YAML中的Object的简要记录 可以建立这样一个层级一对多关系Asset-Object-Type
【Native接口】
获取一个Asset引用的其他Asset AssetDatabase.GetDependencies可以获取直接或间接依赖 这个操作比较耗时可以优化Unity中资源依赖关系获取效率优化 - 知乎获取一个Asset引用的其他Asset的Hash值 AssetDatabase.GetAssetDependencyHash获取一个Asset包含的ObjectIdentifier ContentBuildInterface.GetPlayerObjectIdentifiersInAsset获取一个或一系列Object引用的其他Object ContentBuildInterface.GetPlayerDependenciesForObjects获取一个Object中包含的Type ContentBuildInterface.GetTypesForObject获取一个Asset在目标平台上的Object例如有些Object只在Editor上用打包时要剔除 ContentBuildInterface.GetPlayerAssetRepresentations计算Asset的使用情况例如是否使用光照、雾效、阴影等结果放在BuildUsageTagSet中 ContentBuildInterface.CalculateBuildUsageTags
【什么是增量构建】
增量是缓存的一种方式每次在已有缓存的基础上进行构建就是增量构建。一般的缓存例如对象池等其数据还在内存中增量时缓存数据要保存在磁盘中构建时再加载到内存中。
【如何读代码】
我们看到的代码是完整的增量构建代码但我们读代码时要分开来读。
构建是基础的增量是新加的。要先看如何构建的再看如何做增量的。
看构建时要看输入数据从哪来、输入数据如何使用即输出数据从哪来、输出数据是什么
看增量时要看缓存数据从哪来如何保存、缓存数据如何读取、缓存数据如何使用
总之要分开多个步骤跳着看不要从方法的第一行顺着看到最后一行很容易晕而且也看不懂。
【CalculateSceneDependencyData】
输入数据从哪来
要计算场景的依赖我们可以配置决定要计算哪些场景配置好后会被保存到m_Content.Scenes 输入数据如何使用
这里就是如何计算得到场景的依赖数据核心是调用
ContentBuildInterface.CalculatePlayerDependenciesForScene(scenePath, settings, usageTags, m_DependencyData.DependencyUsageCache);
返回值是SceneDependencyInfo结构体其包含四个字段
internal string m_Scene; 场景的名字internal ObjectIdentifier[] m_ReferencedObjects;依赖的物体internal Type[] m_IncludedTypes;包含的类型internal BuildUsageTagGlobal m_GlobalUsage; 使用的类型
依赖分为递归和非递归两种递归就是要依次获取所有的依赖非递归只要获取直接依赖。
输出数据是什么
得到所有Scene的依赖数据放入到BuildDependencyData中其是该Task的输出Data m_DependencyData.SceneInfo.Add(asset, sceneInfo);
缓存数据如何获取
同一个对象在不同的系统中会有不同的表示也即会有不同的类类中会有些相同的字段来表示同一个对象。
在构建中场景的依赖数据放在SceneDependencyInfo中每个Object对应一个 ObjectIdentifier
在增量中场景的缓存数据放在CachedInfo中每个Asset对应一个CacheEntry
缓存数据获取代码在if (uncachedInfo ! null)中
通过AssetDatabase.GetDependencies获取某个场景依赖的Asset得到依赖中类型为prefab的CacheEntry计算所有CacheEntry的hash128通过其了解场景的依赖是否发生变化计算得到该场景对应的CachedInfo保存所有场景的CachedInfo
缓存数据如何保存
保存代码为m_Cache.SaveCachedData(uncachedInfo)
实现在 BuildCache.SaveCachedData中用多线程进行保存的用多线程是为了加速。
这里需要保存成文件要有输入路径也是可以配置的默认是Library/BuildCache
缓存数据如何读取
读取代码为m_Cache.LoadCachedData(entries, out cachedInfo);
要看懂数据如何读取/导入要先看数据如何保存/导出
缓存数据如何使用
缓存数据必然包含输出数据一般而言就是直接拿来用复杂些需要做个转换。这里直接拿来用即可。
使用缓存数据的核心问题是缓存的数据是不是最新的有效的。因此在使用缓存数据前必须要有个方式判断缓存数据是否有效。
这里的方式是如果引用的Object的类型是Sprite那么重新计算场景的依赖得到新的ObjectIdentifier对比前后的ObjectIdentifier以判断缓存数据是否有效。
【增量的数据结构】
CacheEntry
public GUID Guid //该资源的GUIDpublic int Version //该资源的版本号一般是1public EntryType Type //该资源的类型分为Asset\Data\File\ScriptType 四种一般为Assetpublic Hash128 Hash internal InclusionType Inclusion //显式还是隐式包含明确配置的要收集的Asset是显式的没有被配置但被配置的引用的Asset是隐式的public string File //文件类型时文件的名字public string ScriptType //脚本类型时脚本的名字
CachedInfo
public CacheEntry Asset 自身的CacheEntrypublic CacheEntry[] Dependencies依赖的对应的CacheEntrypublic object[] Data其他附加信息这里用个Object[]数组来统合不同情况的数据类似一个object类型的参数很常见的处理方式。场景的Data为 SceneDependencyInfoBuildUsageTagSetprefabDependency的Hash128ListObjectTypes 每个Object所涉及的Type即哪些脚本类
【CalculateAssetDependencyData】
构建时
将输入和输出数据又做了一层封装封装成TaskInput和TaskOutput感觉没有必要。
输入数据就是要收集的所有Assetm_Content.Assets计算该Asset的依赖数据 var includedObjects ContentBuildInterface.GetPlayerObjectIdentifiersInAssetvar referencedObjects ContentBuildInterface.GetPlayerDependenciesForObjects计算Object的依赖的Object数据计算对象构建使用情况 ContentBuildInterface.CalculateBuildUsageTags对于Sprite类型的资源生成SpriteImporterData获取Asset的AssetRepresentations放入ExtendedAssetData剔除Editor上的Object ContentBuildInterface.GetPlayerAssetRepresentations得到输出数据 所有Asset的依赖数据放入到BuildDependencyData中 m_DependencyData.AssetInfo.Add(o.asset, o.assetInfo);所有Object的依赖数据放入ObjectDependencyData中 m_ObjectDependencyData.ObjectDependencyMap[objectDependencyInfo.Object] objectDependencyInfo.Dependencies;所有Sprite的数据放入BuildSpriteData中 m_SpriteData.ImporterData.Add(o.asset, o.spriteData)所有平台相关的数据放入BuildExtendedAssetData中 m_ExtendedAssetData.ExtendedData.Add(o.asset, o.extendedData);所有的使用情况数据放入BuildDependencyData中 m_DependencyData.AssetUsage.Add(assetOutput.asset, assetOutput.usageTags);
增量时
获取缓存数据GetCachedInfo同样是CacheInfo这个数据结构 public CacheEntry Asset //自身的CacheEntrypublic CacheEntry[] Dependencies //依赖的Asset的CacheEntry可以通过依赖的ObjectObjectIdentifier的GUID找到依赖的Asset自定义的数据有些冗余 BuildUsageTagSetSpriteImporterDataExtendedAssetDataListObjectTypesListObjectDependencyInfoAssetLoadInfo 类同SceneDependencyInfo internal GUID m_Asset; 自身的GUIDinternal string m_Address 自身的路径internal ListObjectIdentifier m_IncludedObjects; 包含的Objectinternal ListObjectIdentifier m_ReferencedObjects; 引用的所有Object缓存数据的保存、读取和使用类同场景