Version: 2018.4
YAML 类 ID 参考
Modifying Source Assets Through Scripting

缓存服务器

Unity 有一个完全自动的资源管线。每当修改 .psd 或 .fbx 文件等源资源时,Unity 都会检测到更改并自动将其重新导入。随后,Unity 以内部格式存储从文件导入的数据。

这种安排旨在使工作流程对于个人用户而言尽可能高效和灵活。但是,在团队中工作时,可能会发现其他用户可能会继续对资源进行更改,所有这些更改都必须导入。此外,在桌面和移动构建目标平台之间切换时,必须重新导入资源。因此,该切换对于大型项目而言可能需要很长时间。

在__缓存服务器__上缓存导入的资源数据可以大大减少导入资源所需的时间。

Unity 在每次导入资源时基于以下内容进行缓存:

  • 资源文件本身
  • 导入设置
  • 资源导入器版本
  • 当前平台

如果以上任何内容更改,Unity 都会重新导入资源。否则,Unity 从缓存服务器下载资源。

使用缓存服务器时,甚至可以跨多个项目共享资源导入(即,在一台计算机上完成导入工作,结果将与其他计算机共享)。

注意:一旦设置启用了缓存服务器,此过程就是完全自动的,因此没有其他工作流程要求。缓存服务器可减少导入项目所需的时间,无需用户进一步干预。

启用缓存服务器

要启用缓存服务器,请执行以下操作:

  1. 打开 Unity Preferences 窗口(在 MacOS 上选择主菜单:__Unity__ > Preferences__,或在 Windows 和 Linux 上选择 Edit__ > __Preferences__)。
  2. 从左侧的类别列表中选择 Cache ServerCache Server 设置将显示在右侧的详细信息面板中。
  3. Cache Server Mode 下拉框中选择 RemoteLocal。随后将显示所选模式特有的属性。
  4. 设置所选模式的 Cache Server 偏好设置

提示:由于硬盘驱动器大小限制,如果可能,最好在单独的计算机上托管缓存服务器。

注意:如果本地缓存服务器具有自定义位置,但该位置变为不可用,Unity 将显示以下警告:

Local cache directory does not exist - please check that you can access the cache folder and are able to write to it

以管理员身份设置__缓存服务器__

管理员需要设置托管缓存资源的__缓存服务器__计算机。

要在远程服务器上设置缓存服务器,请执行以下操作:

  1. 下载缓存服务器:
    • 打开 Unity 的下载存档 (Download Archive) 页面。
    • 找到所使用的 Unity 版本,然后单击目标服务器操作系统的 Downloads 按钮。
    • 单击缓存服务器 (Cache Server) 链接开始下载。
  2. 解压缩文件,结果如下所示:
  3. 运行与操作系统匹配的命令脚本。 随后将出现一个终端窗口,其中显示缓存服务器正在后台运行:

重要信息:缓存服务器需要位于具有大型存储的可靠计算机上(远大于项目本身的大小,因为会存储多个版本的导入资源)。如果硬盘已满,缓存服务器可能会运行缓慢。

将缓存服务器安装为服务

必须将提供的 .sh.cmd 脚本设置为服务器上的服务。 缓存服务器可以随时安全地终止和重新启动,因为它使用原子文件操作。

新版和旧版缓存服务器

默认情况下启动两个缓存服务器进程。旧版缓存服务器适用于 5.0 之前的 Unity 版本。新版缓存服务器适用于 5.0 和之后的 Unity 版本。有关配置、启用和禁用两个不同缓存服务器的详细信息,请参阅下面的缓存服务器配置。

缓存服务器配置

如果通过执行脚本直接启动,将在端口 8125 上启动旧版缓存服务器,而在端口 8126 上启动新版缓存服务器。此外还会在与脚本相同的目录中创建“cache”和“cache5.0”目录,并在其中保存数据。默认情况下,缓存目录最多可增长到 50 GB。可以使用命令行选项配置数据的大小和位置,如下所示:

./RunOSX.command --path ~/mycachePath --size 2000000000

或者

./RunOSX.command --path ~/mycachePath --port 8199 --nolegacy

可以使用以下命令行选项配置缓存服务器:

  • 使用 --port 指定服务器端口。这仅适用于新版缓存服务器。默认值为 8126
  • 使用 --path 指定缓存位置的路径。这仅适用于新版缓存服务器。默认值为 ./cache5.0
  • 使用 --legacypath 指定缓存位置的路径。这仅适用于旧版缓存服务器。默认值为 ./cache
  • 使用 --size 指定两个缓存服务器的最大缓存大小(以字节为单位)。超过此缓存大小时,将自动丢弃最近未使用的文件。
  • 使用 --nolegacy 禁止启动旧版缓存服务器。否则,旧版缓存服务器会在端口 8125 上启动。

托管缓存服务器的计算机的要求

为获得最佳性能,必须有足够的 RAM 来容纳整个导入的项目文件夹。此外,计算机最好配备快速硬盘驱动器和快速以太网连接。硬盘驱动器还应该有足够的可用空间。另一方面,缓存服务器的 CPU 使用率非常低。

缓存服务器和版本控制系统之间的主要区别之一是其缓存的数据始终可以在本地重建。它只是一种提高性能的工具。因此,在互联网上使用缓存服务器是没有意义的。如果是分布式团队,应在每个位置放置单独的缓存服务器。

缓存服务器在 Linux 或 Mac OS X 计算机上的运行效果最好。Windows 文件系统没有针对缓存服务器的数据存储方式进行很好的特别优化,并且 Windows 上的文件锁定问题可能会导致一些在 Linux 或 Mac OS X 上不会出现的问题。

关于缓存服务器的常见问题解答

随着导入和存储的资源越来越多,缓存服务器数据库的大小会无限增长吗?

缓存服务器会自动删除一段时间未使用的资源(当然,如果再次需要这些资源,则会在下次使用时重新创建这些资源)。

缓存服务器是否仅适用于资源服务器 (Asset Server)?

根据设计,缓存服务器对源代码/版本控制系统而言是透明的,因此不局限于使用 Unity 的资源服务器。

哪些更改会导致重新生成导入的文件?

当 Unity 即将导入资源时,它会生成所有源数据的 MD5 哈希值。

对于纹理,这包括:

  • 源资源:“myTexture.psd”文件
  • 元文件:“myTexture.psd.meta”(存储所有导入器设置)
  • 纹理导入器的内部版本号
  • 所有 AssetPostprocessor 的版本号哈希值

如果该哈希值与缓存服务器上存储的哈希值不同,则重新导入资源。否则,将下载缓存版本。客户端 Unity Editor 仅在需要时从服务器中拉取资源 - 资源在更改时不会被推送到每个项目。

如何使用资源依赖项?

缓存服务器不处理依赖项。Unity 的资源管线不处理依赖项的概念。根据设计,它会避免资源之间的依赖关系。AssetPostprocessor 类是一种用于自定义资源导入器来满足需求的常用技术。例如,有时可能希望将网格碰撞体添加到 .fbx 文件中的某些游戏对象(基于名称或标签)。

使用 AssetPostprocessor 来引入依赖项也很容易。例如,可以使用资源旁边的文本文件中的数据向导入的游戏对象添加其他组件。缓存服务器不支持此功能。如果要使用缓存服务器,必须去除对项目文件夹中其他资源的依赖。由于缓存服务器对后处理器中的依赖项一无所知,因此它不知道是否任何内容已发生更改,因此会使用资源的旧缓存版本。

在实践中,可以通过多种方式进行资源后期处理,以便与缓存服务器配合使用。可以使用:

  • 已导入资源的路径
  • 资源的任何导入设置
  • 源资源本身或在其基础上生成的任何数据(在资源后处理器中传递给您)。

使用材质时是否有任何问题?

修改已存在的材质可能会导致问题。使用缓存服务器时,Unity 会验证是否维持了对材质的引用,但由于不会调用后期处理调用,因此在通过缓存服务器导入模型时无法更改材质的内容。因此,使用和不使用缓存服务器进行导入可能会得到不同的结果。

不要从资源后处理器修改磁盘上已存在的材质,因为如果通过缓存服务器下载 fbx 文件,则不会运行导入过程。所以,如果每次运行模型导入器时需要将生成的材质重置为某些生成的默认值,则在导入缓存的 fbx 文件时将不会运行此资源后处理器。

是否有任何资源类型不会被服务器缓存?

有几种类型的资源数据不会被服务器缓存。对脚本文件进行缓存实际上不会带来任何好处,因此服务器会忽略它们。此外,3D 建模软件(Autodesk® Maya®、Autodesk® 3ds Max® 等)使用的原生文件将由应用程序本身转换为 FBX。资源服务器不会缓存原生文件,也不会缓存导入过程中生成的中间 FBX 文件。但是,通过从建模软件导出文件作为 FBX,然后将这些文件添加到 Unity 项目,也许可从该服务器受益。


  • 2018–11–09 页面已修订并只进行了有限的编辑审查
YAML 类 ID 参考
Modifying Source Assets Through Scripting