Best Practices(3) - The Resources folder

  • 本章讨论了Resources系统,这个系统可以让开发者使用一个或者多个名为Resources的文件夹保存资产,并且可以用过Resources API在运行时加载或者卸载。

目录


  • Best Practices(3) - The Resources folder
  • 目录
  • 1.1 Resources系统最佳实践
  • 1.2 正确的使用Resources系统
  • 1.3 资源序列化


1.1 Resources系统最佳实践

!!!不要使用它
这个很重要的建议有几个原因:

  • 使用Reosurces文件夹会使颗粒度的内存管理变得更加困难
  • Resources文件夹使用不当会增加应用程序启动时间和构建时间
  • 随着Resources文件夹数量的增加,这些文件夹中的资产管理会变得很困难
  • Resources系统无法通过流进行传输,并且无法热更新
  • AssetBundle才是Unity用于热更新的主要工具

1.2 正确的使用Resources系统

在不妨碍良好的开发实践前提下,Resources系统有助于两种用途:

  • Resources文件夹的简易性可以用来快速构建项目原型,但是,当项目进入全面生产阶段时,应取消使用Resources文件夹。
  • Resources文件夹在一些地方,也有用处
  • 在整个游戏的生命周期都需要使用
  • 内存压力不大
  • 不需要经常修改,或者在不同平台之间不需要单独处理
  • 需要构建最小包
    第二种情况的例子包括用于托管预制体的MonoBehaviour的单例,或者包含第三方配置数据(比如Facebook应用程序ID)的ScriptableObjects。

1.3 资源序列化

在构建工程的时候,名为Resources的所有文件夹中的资产和对象都合并为一个序列化文件,该文件还包含元数据和索引信息,类似于AssetBundle,正如AssetBundle文档中的描述,此索引包含了一个序列化的查找树,用于将给定对象的名称解析为适当的文件GUID和本地ID,它也用于在序列化文件正文中根据特定字节偏移定位对象。

在大多数平台上,查找数据结构都是使用平衡树,其查找时间以0(n log(n))的速率增长,随着Resources文件夹中对象数量的增加,这种增长也会导致索引的加载时间增长超过线性增长。

此操作是不可跳过的,发生在应用启动的时候,这个时候应用会显示splash界面,根据观察,初始化一个包含10000个资产的资源系统在低端移动设备上会耗时很多秒,就算是Resources文件夹中包含的大多数对象不会加载到第一个场景中。