视频网站开发前景如何,做的网站浏览器提示不安全,自己想做个网站 费用,网络营销基本含义【前言】
Unity的资源工作流程分为导入、创建、构建、分发、加载。我们说的是其中的构建步骤。
构建是指将项目工程中的资源文件和代码整合程可执行文件的过程#xff0c;构建的结果是生成可执行文件#xff0c;在win平台上是exe#xff0c;在Android平台上是apk#xff…【前言】
Unity的资源工作流程分为导入、创建、构建、分发、加载。我们说的是其中的构建步骤。
构建是指将项目工程中的资源文件和代码整合程可执行文件的过程构建的结果是生成可执行文件在win平台上是exe在Android平台上是apk在ios平台上是ipa。
游戏比互联网的app多了很多资产资产的整合是构建过程中非常耗时且重要的一步这一步通常会被单独拿出来说叫打包在Unity中叫打Bundle。因此我们说游戏构建通常分为两个大步骤一是打包二是构建。
Unity目前主要提供两种打包方式
一是默认的BuildPipeline.BuildAssetBundles
二是比较新的Scriptable Build Pipeline
SBP的功能日趋完善逐渐被认可是以后的主要趋势。
SBP底层调用的接口和BuildIn的类似是在其基础上实现的SBP将打包过程中的更多的接口暴露出来采用流水线的设计方式提供更加灵活的打包方式。
【流水线模式】
流水线概念源于现代工业在生产流水线上原材料经过一系列操作被制作成商品每个操作可能会修改原材料或添加新材料
将其转换为代码我们可以提炼三个关键词材料data操作Operation流水线Pipeline每个操作继承一个IOperation接口每个材料继承IData接口Pipeline有一系列的IOperation和IData先准备好一系列操作和材料随后顺序执行每个操作。
如果随后需要添加新的操作和材料向流水线中添加即可具体实现可以看下面的文章
流水线的实现
【SBP的优势】
流水线本身带来的优势
灵活性更精细的控制打包流程增加自定义处理并行性将打包步骤进行了拆分有利于在某些步骤做并行处理减少打包时长
其他优势
增量打包对打包做了数据缓存有利于减少打包时长精细日志对打包过程做了更细粒度的Profiler、耗时信息统计、结果日志输出有利于在对打包流程进行分析和优化
【SBP的流水线实现】
IData对应IBuildContextIOperation对应IBuildTaskPipeline对应ContentPipeline
ContentPipeline应该持有一系列的IBuildContext这里没有设置单独的字段持有而是在调用BuildAssetBundles方法时将其作为参数传入
持有时作为字段还是方法参数区别不大都可。
正常来说会有个ListIBuildContext但这里被封装到一个类BuildContext中 BuildContext buildContext new BuildContext(contextObjects); ListIBuildTask一般来说会在Pipeline中foreach顺序执行这里将执行拿出来放在BuildTasksRunner中这样做是为了自定义的Pipeline也能用同一个执行逻辑。
接下来的问题是如何传递数据每个Task都有需要的初始化数据和处理完成的结果数据如何获取初始化数据并将结果数据传递出去。
SBP用InjectContextAttribute特性简化每次手动取值赋值。 foreach (IBuildTask task in pipeline){{try{if (!tracker.UpdateTaskUnchecked(task.GetType().Name.HumanReadable()))return ReturnCode.Canceled;ContextInjector.Inject(context, task);ReturnCode result;using (logger.ScopedStep(LogLevel.Info, task.GetType().Name))result task.Run();if (result ReturnCode.Success)return result;ContextInjector.Extract(context, task);}catch (Exception e){BuildLogger.LogError(Build Task {0} failed with exception:\n{1}\n{2}, task.GetType().Name, e.Message, e.StackTrace);return ReturnCode.Exception;}}}
通过ContextInjector.Inject(context, task)将初始化数据注入通过ContextInjector.Extract(context, task)将数据取出。
为此需要将ListIBuildContext封装用字典保存数据类及其实例 public class BuildContext : IBuildContext{internal DictionaryType, IContextObject m_ContextObjects;
}
【SBP的Task】
Setup SwitchToBuildPlatform 切换至目标平台RebuildSpriteAtlasCache 重新构建图集Player Scripts BuildPlayerScripts 编译目标平台源代码PostScriptsCallback 编译后处理回调Dependency CalculateSceneDependencyData 计算场景依赖数据CalculateAssetDependencyData 计算资源依赖数据AddHashToBundleNameTask 修改bundle名字为hashStripUnusedSpriteSources 剔除Asset中被 SpritePacker 打包的Sprite的引用CreateBuiltInShadersBundle 创建BuildIn 的Shader对应的BundleCreateMonoScriptBundle 创建脚本对应的bundlePostDependencyCallback 依赖后处理回调 Packing GenerateBundlePacking 组装AssetBundle并计算依赖加载列表GenerateBundleCommands 为AssetBundle生成写入参数GenerateSubAssetPathMaps 向AssetBundle里插入扩展资源GenerateBundleMaps 生成AssetBundle之间的依赖关系PostPackingCallback 组装后处理Writing WriteSerializedFiles 生成序列化文件ArchiveAndCompressBundles 构建和压缩BundleGenerateLocationListsTask 生成检索的LocationPostWritingCallback 写入后处理Other GenerateLinkXml 生成AssetBundle的link文件用于代码裁剪GenerateCatalog 生成Catalog文件
【参考】
【Unity】SBP - Scriptable Build Pipeline - 知乎