在团结引擎中首次打开项目工程时,需要完整地导入工程文件夹中所有的资源文件。当项目工程较大时,导入耗时很长(可长达数小时甚至十几小时)。 为缩短引擎编辑器开启耗时,提升开发效率,团结引擎新增了资源按需导入模式。开启资源按需导入模式后,打开工程时仅需导入少量必需的资源。其余资源仅在需要被访问时导入。对于多人协作的大型项目,一个开发者通常只需访问工程中的小部分资源,因此可省去导入其它大量资源的时间。实测数据显示,部分项目打开时间可以从2小时以上降至不到4分钟。
资源按需导入的时机有以下两种:
自动触发(默认):引擎需要访问资源时自动触发,对开发者透明,使用安全便捷。
手动触发:开发者可以选择手动触发,避免后续编辑时因资源动态导入影响操作流畅度。
按需导入支持以下两种打开方式:
-ondemand=normal
adb2.txt 的文件,内容如下: OnDemand=normal
其中,On-Demand 参数的值可设为:
| 值 | 说明 |
|---|---|
| off | 关闭 On-Demand Import,使用普通导入模式(效果等同于没有 adb2.txt 文件) |
| normal | 启用 On-Demand Import,并采取较为保守的导入策略,.asset 文件及其依赖会在首次打开工程时导入 |
| aggressive | 启用 On-Demand Import,并采取较为激进的导入策略,.asset 文件及其依赖均会按需导入 |
按需导入通过开启导入进程来完成资源的导入,可以在 adb2.txt 中配置期望的导入进程数量。可配置的字段如下:
| 值 | 说明 |
|---|---|
desiredworkercount |
导入管线最佳并行运行的导入工作进程数量。 |
standbyworkercount |
即使工作进程处于空闲状态,也要保留的最小工作进程数量。如果工作进程数量超过该值,引擎会关闭已空闲一段时间的导入工作进程,以释放系统资源。 |
desiredworkercount 推荐设置为系统逻辑核心数量的 1/4,standbyworkercount 推荐设置与 desiredworkercount 相同的值。如果 desiredworkercount 设置过高,导入工作进程可能会与其他进程产生竞争。
通过 adb2.txt 的方式,以保守的策略开启按需导入并打开工程,同时设置期望并行运行的工作进程为 4,最小保留的工作进程为 4,可以在 adb2.txt 按照如下方式进行配置:
ondemand=normal
desiredworkercount=4
standbyworkercount=4
按需导入模式下,Project 窗口中的资源分为两种状态:
如下图所示(红色框内为未导入状态文件,绿色框内为已导入状态文件):
Fbx 模型文件:
Prefab 资源文件:
材质文件:
在对资源执行查看、编辑或使用操作前,必须先进行导入。
在 Project 窗口中选中一个或多个未导入资源时,编辑器会自动触发这些资源的导入。支持所有选中方式:
注意: 选中文件夹不会加载文件夹中的资源。
在资源选择窗口中点击某个资源时,触发该资源的导入操作。例如在材质的属性面板中,打开 Select Texture 窗口。点击其中未加载的纹理时,会触发该纹理的导入。
启用按需导入模式后,Project 窗口的工具栏中会出现“资源导入”的按钮,点击后弹出菜单。其中包含两个导入命令和两个设置项。
点击 Import Unimported Assets From Selected Folders ,从当前选中的文件夹中查找所有未导入资源并执行导入操作。在不同的Project 窗口视图模式下选中的文件夹范围也不同。
点击 Import Unimported Assets From Search Results,将当前搜索结果列表中的所有未导入资源执行导入操作。此操作不会导入搜索结果中的文件夹内资源,仅对搜索结果列表中的资源项生效。
勾选 Import From Subfolders Recursively,递归导入子文件夹中的资源。
勾选 Import From Selected Folders Automatically 后,当文件夹被展开时,自动导入其中的未导入资源。
在 Project Window 单击选中场景资源时,仅导入 SceneAsset 对象。在双击打开一个场景时,才会触发该场景内引用的所有资源的导入。
在脚本中通过 AssetDatabase 相关接口导入或加载资源,或访问资源中的对象时,会先导入该资源(及其引用的资源)。
相关接口有:
注意:
有些查询函数,对于未加载的资源,会返回无效值,比如:
注意: 调用 FindAssets 接口查找资源时,不会导入搜索范围内的未导入资源。
首次调用 Resources.Load 相关接口时,会触发项目中所有 Resources 文件夹下资源的导入。 相关接口包括:
LoadLoadAllLoadAsync在脚本中调用 BuildPipeline.BuildAssetBundles 接口来构建 AssetBundles 时,会先导入待打包的所有资源。
通过 Build Settings 界面的 Build 按钮,或通过脚本调用 BuildPipeline.BuildPlayer 接口进行构建工程时,会导入待构建场景引用的所有资源。
工程打开时导入的资源:
文件夹
cs, asmdef, asmref 后缀的文件dll, winmd, so, jar, java, kt, aar, suprx, prx, rpl, cpp, cc, c, h, jslib, jspre, bc, a, m, mm, swift, xib, bundle, dylib, config 后缀的文件.androidlib, .bundle, .framework, .plugin 后缀的文件夹cginc, cg, glslinc, hlsl, shader, computeLocalization资源:.po
.uss, .uxml 等.asset 文件.asset 文件中引用到的资源.asset 文件AssetPostprocessor.OnPostprocessAllAssets() 在OnDemand资源被导入时不会被调用。