这是 Unity 5 [资产, 资源和资源管理系列文章]的第三篇。
这个章节将讨论 Resources 系统。这个系统可以让开发者通过 Resources API 加载或卸载存储在在一个或多个以 Resources 命名的文件夹中的资产。
Resources 系统的最佳实践
下面情况不要使用它
这个强烈建议有下面几点原因:
- 使用 Resources 文件夹会让内存颗粒度管理变得更困难
- 不正确的使用 Resources 文件夹会增加应用启动时间和包的大小
- 随着在 Resources 文件中的文件增加,管理这些文件会变得很困难
- Resources 系统自定义的平台特殊文件推送变得恶化并且不能增量更新
- AssetBundle 变体是 Unity 用来不同平台内容调整的主要工具
Resources 系统正确使用:
下面两种情况 Resources 系统很有用处:
- 因为 Resources 系统很容易使用,它很适合是在快速原型制作和试验。但是当项目要转成产品时,强烈建议不要使用 Resources 文件夹
- Resources 文件夹对一些满足如下条件的案例很有用:
- 存储在 Resources 文件夹下的内容不要很大的内存
- 存储在 Resources 文件夹下的内容在整个项目周期都有用
- 内容基本不用升级
- 内容在各平台都一样的
上面第二种情况(存储在 Resources 文件夹下的内容在整个项目周期都有用)例子包括在全局使用的 MonoBehaviour 单例的预设或者第三方配置数据中的资产,比如 Facebook 应用的 ID。
当项目构建完成之后,所有名为 Resources
的文件夹内的资产和对象都会被合并到然后序列化到同一个文件中。这个文件跟 AssetBundle 类似,包括包含了源数据和索引信息。就像在 AssetBundle 基本原理章节中的 什么是 AssetBundle 小节中提到的,索引信息里面包括了处理对象名字到对应的文件 GUID 和本地ID 的查找树。它也用来定位对象在序列化文件中的偏移位置。
用于查找的数据结构是平衡搜索树[1](在大多数平台上),它的构建时间增长到了 O(nLog(N)), 其中 N 是在查找树内的对象的个数。这个增长也使 Resources 文件夹内的对象增加时,索引的加载时间会比线性增长时间长。
这个操作是在程序启动,不可交互的闪屏页显示时发生,是不能去除的。一个包含 10000 个资产的 Resouces 系统,即使其中大部分资产都不需要在第一个场景中加载,在低端移动设备上初始化也需要好几秒的时间。
脚注
[1] 在大部分平台上是 C++ STL(Standard Template Library)中的 std:multimap
原文链接: https://unity3d.com/learn/tutorials/topics/best-practices/asset-bundle-fundamentals