新Asset Import Pipeline(资源导入管线):加快资源导入的坚实基础

https://connect.unity.com/p/xin-asset-import-pipeline-zi-yuan-dao-ru-guan-xian-jia-kuai-zi-yuan-dao-ru-de-jian-shi-ji-chu

 

 

在2019.3版本中,新的项目默认使用Asset Import Pipeline,以便帮助用户实现更快的平台间切换、筑下快速导入的基础,为用户节省时间。同时,我们也针对大型项目对资源管线进行了优化。请在本文中了解这些新改善、我们的动机及考虑。
 
作者:Javier Abud,2019年11月7日
 
 
 
 
当你将新资源放入项目中时,资源并不会立刻变成项目的一部分,只有当Asset Import Pipeline找到并导入资源后,它才会被糅合进项目中。Asset Import Pipeline的主要职责之一就是项目状态的正确探测,允许我们用不同的API来查询状态。
 
在2017年,我们开始了Asset Import Pipeline的代码重写工作,力图让方法更加耐用、更具缩放性,同时也要解决用户在日常工作流中遇到的许多痛点。现在,在Unity 2019.3中(现为beta测试版),新的Asset Import Pipeline(又可称为Asset Import Pipeline V2)将成为新项目的默认管线。旧项目也可选择升级到新的管线,享受新系统的各种好处。
 
今天正是我们将分享新管线的设计思路。具体来说,我们希望确保新系统能与现有API兼容,在升级到新管线时不必重写脚本,在这步上我们做了不少考虑。
 
 
 
 
 
 
更短的导入时间
 
在日常开发过程中,会涉及到非常多的工作流。我们找出了其中最耗时间的部分,用了几种不同的方案来解决它们。
 
导入资源有时非常花时间。将源数据转换为Unity编辑器或某个平台能使用的数据格式,并非轻而易举。比方说,导入一个复杂3D模型需要的计算量非常巨大,如果模型上还有动画,则需求的时间会更长。
 
要解决此类问题,首先要明确3个关键概念:
 
 
 
导入结果
 
对于大多数类型的资源来说,Unity需要依据项目的目标平台,将数据由源数据转换为目标数据。转换的结果多种多样,一般包括几种GPU兼容的格式,如PVRTC、ASTC和ETC。
 
大多数资源文件的格式都是针对存储而优化过的,而在游戏或其它实时应用中,GPU、图形或音频一类的硬件使用的是即取即用的资源数据格式,。
 
又例如,当Unity导入一张PNG图片文件作为纹理,引擎并不会在运行时使用原本的PNG格式数据。当导入纹理时,Unity会用一种不同的格式创建一张新的图片,并将其存储到项目的Library(库)文件夹中。该图片版本主要会由引擎的Texture(纹理)类使用,引擎会将其上传到GPU处理器用于实时显示。而此类图片就是所谓的导入结果。
 
 
 
决定论
 
在不同硬件上,我们需要确保导入后的结果是相同的,数据能拥有一样的格式。这种输入相同,结果也相同的原则,我们称为决定论。
 
 
 
依赖追踪
 
新资源导入管线可追踪各资源的所有依赖关系,存储所有资源的导入结果。资源的导入依赖是唯一可以影响导入结果的部分,如果资源的导入依赖有改动,则导入结果的缓存会过时,需要重新导入才能将改动反映到缓存中。
 
 
 
新Asset Import Pipeline介绍
 
某些情况下,导入操作可能会非常耗时。在以下两个工作流中:Fresh Project Import(刷新项目导入)Fast Platform Switching(快速平台切换),我们应用了两种方案来解决以上问题。
 
 
 
刷新项目导入
 
在首次建立项目时,Library文件夹内并无内容。我们需要重新列举和导入资源文件夹下的每项资源,此种操作非常耗费性能。然而,如果能让不同设备的导入过程能保持稳定一致,则检索导入结果的时间可缩短数个量级,具体缩短时间取决于源资源和导入结果的大小。
 
我们使用了新的Unity Accelerator来实现导入过程的稳定一直。任何用户可使用Accelerator将导入结果存储到云,而其它用户可直接从服务器下载导入结果,无需冗杂繁复的流程来导入资源。
 
 
 
快速平台切换
 
直到Unity 2019.2(使用旧版Asset Import Pipeline),Library文件夹中的文件名皆为资源的GUID。因此,从一个平台到另一个平台的切换会导致Library文件夹中的导入结果失效,每次切换平台都需要重新导入资源。
 
 
旧Asset Import Pipeline
 
如果每天需要在不同平台间切换多次,重新导入资源可能会耗上数个小时(取决于项目大小)。
 
部分用户可能找到了一种变通方法,在设备上的每个平台中都存储一份项目的拷贝,但是它并不是万金油。
 
在新资源导入管线中,我们不再使用GUID作为文件名。我们可以追踪单个资源的依赖,将依赖哈希值化,创建一个资源导入结果的修订版列表。我们可为各资源创建多个修订版,不必再依赖文件名列表中的GUID。这样一来,导入结果便能在不同的配置下照常工作了。至于快速平台切换,我们可在每个平台上使用单独的导入结果,在平台间切换时,平台中将已存有相应的导入结果。与旧版资源导入管线相比,此种方法可以将速度提升许多量级。
 
 
新Asset Import Pipeline
 
可能的缺点
 
当更改资源路径时,Unity会生成更多新文件,占用更多的硬盘空间。不过,我们也有解决方法,当Unity重启时,系统会删去无用的导入结果。引擎会在各平台上保存最新的导入结果,以保存快速平台切换的功能,删去旧导入结果,解放磁盘空间。
 
 
 
如何升级到新的资源导入管线
 
我们可以在Unity 2019.3 beta中使用新的资源导入管线。旧项目则可在编辑器的Project Settings Window(项目设置窗口)中升级到新管线。
 
 
 
 
 
选择Version 2(版本2)就能告诉编辑器在此项目中使用新管线,在重启项目时,编辑器会使用新管线的代码重新导入资源,从效果上来说它和删除Library文件夹效果相似,只是并不会真正删除原资源。在切换到新管线时,原管线上的文件并不会被删除,新管线会新建一个文件夹来存储导入结果。
 
在Unity 2019.2及更旧版本上创建的项目默认仍将使用旧导入管线。在Unity 2019.3中首次打开此类项目时,用户可选择升级到新的导入管线。如果拒绝升级,则项目依旧会使用旧导入管线。此外,项目版本信息会存储在EditorSettings.asset文件中,用户可自行控制版本。
 
 
 
用新资源导入管线创建的新项目
 
当使用Unity 2019.3或更新的版本创建新项目时,所有项目都将默认使用新的资源导入管线。
 
 
 
我们将推出更多改善
 
在Unite哥本哈根2019上,我们团队做了两次相关演讲。本人的演讲内容基本就是本文的内容,希望这些知识能帮助你作出自己的资源管理策略。我的同事Jonas Drewsen的演讲则主要关于未来将推出的增加资源管线拓展性、项目稳定性的功能:
 
 
 
 
 
 
现已在Unity 2019.3 beta版中上线
 
快来参与Unity 2019.3 beta测试,试试新的Asset Import Pipeline吧。我们期待你在论坛上的反馈!如果还有什么问题,也可以在Twitter上联系我。
posted @ 2020-09-27 15:35  MATU  阅读(879)  评论(0编辑  收藏  举报