Unity-Cache-Server

注:由于没有做过游戏开发,也没有使用过unity,所以有问题的地方欢迎在评论指正

缓存服务器

  Unity的打包流程中最慢的环节就是贴图的压缩。不同的平台,需要把原始贴图压缩成对应平台的压缩贴图格式。iOS和Android平台对应的格式不同。针对这个问题,Unity官方给出了一个CacheServer的解决方案。CacheServer只是一个文件cache服务器,记录了贴图源文件和转换参数(meta文件)以及转换器版本等信息构成的字符串的md5值作为文件索引。第一个做转换的人,在本地进行压缩后,会把结果传到CacheServer,其他人使用时,就会优先去看有没有人做过同样的工作,如果有就从cache服务器下载资源,没有就会进行压缩,并上传结果到CacheServer。如果源文件、转换参数都完全一样,结果会被缓存。在日常所有贴图都会被压缩过,可以节约压缩贴图的时间,从而减少打包时间。

  Unity官方在3月发布了Cache Server v6.0.0版本,官方宣称6.0带来了更高的可靠性和性能,以及一系列的新功能。包括新模块化,实现最大的I/O性能,支持高性能的缓存模式等等。

  Unity用户手册中也有关于Cache Server介绍和使用,但截至9.26日,官网的用户手册还停留在2月份的,没有做更新。关于文件更改请仔细阅读官网手册英文原文说明或下方翻译:

关于缓存服务器,Unity具有一个全自动的资源管道。当修改了类似于.psd.fbx文件的资源后,Unity将检测到更改并自动重新导入更改后的文件。从文件导入的数据之后将由Unity按其内部格式存储。资源管道最重要的部分是“热重载”功能和保证您的所有资源始终同步为所见即所得模式。此功能的实现也是要付出代价的。任何修改的资源必须重新导入。在一个大团队中工作时,获得了最新的管理源代码(Source Control)后,您通常需要等很长一段时间才可将所有其他成员修改或创建的资源重新导入完成。另外,在PC和移动平台之间来回切换工程平台,也将引发重新导入大部分资源的操作。

缓存服务器(Cache Server)上缓存导入的资源数据可大幅缩短导入资源占用的时间。

缓存每个导入的资源基于:

  资源文件本身

  导入设置

  资源导入器版本

  当前平台

如果上述四项任意一项发生变化,资源将重新导入,否则,会从缓存服务器(Cache Server)下载更新后的资源。启用偏好设置(Preferences)中的缓存服务器后,您可以共享多个工程的导入资源。

注意:将缓存服务器设置好后,这个过程将是完全自动的,这意味着无需其他工作流程。它只是缩短了导入工程的时间,无需您进行操作。

配置要求

  只考虑将CacheServer搭在本地环境,cache服务器不同于版本控制,其缓存数据可以随时在本地重建,没必要使用远程服务器。如果存在开发团队分布在各地的情况,选择在每个地方配置一台独立缓存服务器比较好。

  因为CacheServer只相当于一个文件cache服务器,所以配置并不需要太高。但是为了最佳性能,机器必须要有足够的RAM来存储整个导入的工程文件夹。机器最好使用SSD,保证读写速度。另外CacheServer的CPU使用率非常低。最好使用Linux或Mac OS X系统。Windows 文件系统未对资源缓存服务器 (Asset Cache Server) 存储数据的方式进行特别理想的优化,Windows 上的文件锁定问题可引发问题,但 Linux 或 Mac OS X 上不会出现此类问题。

用户使用

  Unity Cache Server 用户配置使用非常简单:

  1. 在编辑器中选择偏好设置(Preferences)

  2. 选择Cache Server,Mode选择Remote,输入缓存服务器的IP地址即可

cache server本地配置

  如果缓存服务器配置正确,不存在网络问题的话,Check Connection之后就会出现如图所示连接成功。如果失败的话,可能是缓存服务器配置问题。

管理员配置

  Cache Server升级到v6版本之后只支持npm方式安装,所以机器需要先安装LTS版本(长期支持版本),目前官方推荐的版本是v8.10.0. 下载地址:https://nodejs.org/en/download/

  node环境配置好之后,使用npm安装:

npm install unity-cache-server -g
或
npm install github:Unity-Technologies/unity-cache-server -g

  安装完成之后,命令行输入下面的指令:

unity-cache-server

cache server location

  然后unity-cache-server就启动起来了,可以看到默认的缓存路径位于unity-cache-server安装目录下,我们也可以指定缓存路径和端口,缓存模式等。用法附带常用命令表:

用法:
unity-cache-server [arguments]
命令 描述
-V, –version 查看缓存服务器的版本号
-p, –port 缓存服务器监听的端口,默认端口是8126。
-c, –chache-module [path] 缓存模块路径,默认值是’cache’
-P, –cache-path [path] 缓存路径
-l, –log-level \ 日志详细程度,等级0(没有提示) - 5(调试模式),默认值为3
-w, –workers \ 要生成的工作线程数,默认值为0。
-h, –help 显示使用帮助 

配置文件

  配置文件位于unity-cache-server安装目录下config/default.yml,配置系统基于node-config模块,关于如何管理特定环境的配置文件的其他信息,可以参阅node-config配置文档。

  默认情况,run unity-cache-server使用的是内置的配置文件,当然我们可以修改内置的配置文件。另外也可以将配置信息写入新文件,使用–NODE_CONFIG_DIR命令使用该配置文件。

配置文件常用命令

命令 默认值 描述
Cache.options.processor.putWhitelist [] 允许上传更改的IP地址数组,类型为字符串
Server.options.allowIPv6 false 在IPv4和IPv6上监听客户端连接
// cd到unity-cache-server安装目录,如果不清楚安装位置,可以先运行 unity-cache-server,查看path
cd /Users/wangx/.nvm/versions/node/v8.11.3/lib/node_modules/unity-cache-server/
vi config/default.yml

default.yml

  常用只需要修改这两个配置,因为放在本地网络环境,可以不需要修改allowIpv6,只修改putWhitelist即可,注意yml语法,以及putWhitelist值为字符串值,这个是一定要注意的,不然会导致cache server启动成功却不能使用缓存服务。建议修改完之后做一下YAML语法检测,YAML在线检测网址

  至此,server的配置就基本完成了。然后在启动server,测试是否成功。端口可以使用默认端口,但最好指定一个cache结果缓存目录,方便查看和清理。本文先使用cache_fs,高性能文件系统缓存模式,下一篇文章将对比说明cache_ram模式。

// 我这里使用的mac OS X作为server,缓存目录放在用户目录下 unity-cache/
unity-cache-server -P /Users/wangx/unity-cache/

  注意unity-cache-server命令区分大小写,-p和-P代表的命令不一样。

unity-cache-server -P

测试使用

  客户端配置参考上文的用户使用,第一遍导入时,就会压缩一次贴图,并将结果缓存到cache-server。因此第一次压缩贴图的时间并不会缩短。第一次压缩完成后server上指定的缓存目录下就会有缓存结果。

缓存结果

缓存结果

  然后我们再次切换到相同平台的时候,速度会加快很多倍。当然仅限于相同平台,如果不同平台,本机又可以提交修改,然后缓存结果就会被体会,再次切相同平台同样会重新压缩贴图。如前文中的Unity哪些更改会导致资源重新导入。例如:

游戏项目是android平台的,但是unity初次导入项目会默认在PC平台,所以压缩贴图的时候会压缩成PC支持的格式。切到Adroid平台的时候会重新压缩一遍贴图,就会重新导入。所以建议putWhitelist在第一次导入的时候只填写第一个上传项目压缩贴图的IP地址,待所有人都切到相同平台的时候,再加入能提交更改的IP。

还有另外一种比较好的方式:

  在Server上缓存的是Android平台的缓存结果,导入项目如果能直接是在Android平台就会直接下载缓存结果,避免因平台的切换导致部分资源被重新导入。有关如何通过命令行启动Unity并完成平台的切换,请百度或google,“unity如何直接在打开时完成开发平台的切换”。当启动Unity就处于Android平台,就会直接下载Cache Server的缓存结果。

  结果缓存成功,再次切平台的就会从cache server下载缓存,整个过程基本能在1-2分钟内完成,速度提升很多倍。在server的log中可以看到发送缓存记录:

download from cache server

log

现有项目导入

  上面的导入缓存配置较为简单,但是如果是已有Unity项目又不想重新做一次导入,可以使用Unity官方提供的这种方式进行导入。前提是进行导入的客户端IP地址需要包含在白名单中,并且项目要具有Library文件夹。

  1. 将安装目录下Unity文件夹的CacheServerTransactionImporter.cs脚本添加到Unity项目下。对于这部分的工作我不是太清楚,具体如何设置,请参考unity-cache-server官方的说明。https://github.com/Unity-Technologies/unity-cache-server, Unity project Library Importer.

  2. 添加成功之后,等待刷新一下,Unity的菜单栏就会出现Cache Server Utilities选项,然后选择导出,Export Transactions.选择导出json文件的路径,保存。

  3. 在导出结果的客户端执行下面的命令:

    unity-cache-server-import <path to json file> [server:port]
    

    注:这一步需要导入客户端的地址在配置文件的putWhitelist中,否则会导致写入失败。

    如果配置没有问题的话就会看到server log会有资源文件的上传记录,此阶段可以将log-level 设置为4,就能看到上传记录。

unity menu

import shell

server import

  等待上传完成,server就缓存了客户端已经有的缓存结果了。其他客户端就可以从cache server导入资源。

总结

  至此,关于unity-cache-server最新版本v6的使用及配置就差不多了。其中可能有一些地方是可以改进,或者可以详细说明的,但我是个门外汉,对很多unity相关的内容都不太清楚。所以还是欢迎指正,另外在使用时有疑问也可以评论或邮件联系。