重要信息:缓存服务器 (Cache Server) 仅支持资源导入管线 (Asset Import Pipeline) 版本 1。如果您使用的是资源导入管线版本 2,请改用 Unity Accelerator。
Unity 有一个完全自动的资源管线。每当修改 .psd 或 .fbx 文件等源资源时,Unity 都会检测到更改并自动将其重新导入。随后,Unity 以内部格式存储从文件导入的数据。
这种安排旨在使工作流程对于个人用户而言尽可能高效和灵活。但是,在团队中工作时,可能会发现其他用户可能会继续对资源进行更改,所有这些更改都必须导入。此外,在桌面和移动构建目标平台之间切换时,必须重新导入资源。因此,该切换对于大型项目而言可能需要很长时间。
在__缓存服务器__上缓存导入的资源数据可以大大减少导入资源所需的时间。
Unity 在每次导入资源时基于以下内容进行缓存:
如果以上任何内容更改,Unity 都会重新导入资源。否则,Unity 从缓存服务器下载资源。
使用缓存服务器时,甚至可以跨多个项目共享资源导入(即,在一台计算机上完成导入工作,结果将与其他计算机共享)。
注意:一旦设置并启用了缓存服务器,此过程就是完全自动的,因此没有其他工作流程要求。缓存服务器可减少导入项目所需的时间,无需用户进一步干预。
要启用缓存服务器,请执行以下操作:
提示:由于硬盘驱动器大小限制,如果可能,最好在单独的计算机上托管缓存服务器。
注意:如果本地缓存服务器具有自定义位置,但该位置变为不可用,Unity 将显示以下警告:
Local cache directory does not exist - please check that you can access the cache folder and are able to write to it
管理员需要设置托管缓存资源的__缓存服务器__计算机。
要在远程服务器上设置缓存服务器,请执行以下操作:
重要信息:缓存服务器需要位于具有大型存储的可靠计算机上(远大于项目本身的大小,因为会存储多个版本的导入资源)。如果硬盘已满,缓存服务器可能会运行缓慢。
必须将提供的 .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 上不会出现的问题。
缓存服务器会自动删除一段时间未使用的资源(当然,如果再次需要这些资源,则会在下次使用时重新创建这些资源)。
根据设计,缓存服务器对源代码/版本控制系统而言是透明的,因此不局限于使用 Unity 的资源服务器。
当 Unity 即将导入资源时,它会生成所有源数据的 MD5 哈希值。
对于纹理,这包括:
如果该哈希值与缓存服务器上存储的哈希值不同,则重新导入资源。否则,将下载缓存版本。客户端 Unity Editor 仅在需要时从服务器中拉取资源 - 资源在更改时不会被推送到每个项目。
缓存服务器不处理依赖项。Unity 的资源管线不处理依赖项的概念。根据设计,它会避免资源之间的依赖关系。AssetPostprocessor 类是一种用于自定义资源导入器来满足需求的常用技术。例如,有时可能希望将网格碰撞体添加到 .fbx 文件中的某些游戏对象(基于名称或标签)。
使用 AssetPostprocessor
来引入依赖项也很容易。例如,可以使用资源旁边的文本文件中的数据向导入的游戏对象添加其他组件。缓存服务器不支持此功能。如果要使用缓存服务器,必须去除对项目文件夹中其他资源的依赖。由于缓存服务器对后处理器中的依赖项一无所知,因此它不知道是否任何内容已发生更改,因此会使用资源的旧缓存版本。
在实践中,可以通过多种方式进行资源后期处理,以便与缓存服务器配合使用。可以使用:
修改已存在的材质可能会导致问题。使用缓存服务器时,Unity 会验证是否维持了对材质的引用,但由于不会调用后期处理调用,因此在通过缓存服务器导入模型时无法更改材质的内容。因此,使用和不使用缓存服务器进行导入可能会得到不同的结果。
不要从资源后处理器修改磁盘上已存在的材质,因为如果通过缓存服务器下载 fbx 文件,则不会运行导入过程。所以,如果每次运行模型导入器时需要将生成的材质重置为某些生成的默认值,则在导入缓存的 fbx 文件时将不会运行此资源后处理器。
有几种类型的资源数据不会被服务器缓存。对脚本文件进行缓存实际上不会带来任何好处,因此服务器会忽略它们。此外,3D 建模软件(Autodesk® Maya®、Autodesk® 3ds Max® 等)使用的原生文件将由应用程序本身转换为 FBX。资源服务器不会缓存原生文件,也不会缓存导入过程中生成的中间 FBX 文件。但是,通过从建模软件导出文件作为 FBX,然后将这些文件添加到 Unity 项目,也许可从该服务器受益。