此文全程处于
linux
环境,阅读此文需具备一些linux
使用经验。
解决饥荒卡顿有两个方法,如果你是单人联机玩家,可以添加长路独行模组,开启后就可以获得与单机版相同的游戏体验,此模组的原理的注意事项可以点此查看。
对于联机玩家,可以搭建专用服务器优化卡顿。饥荒联机版专用服务器 (Don’t Starve Together Dedicated Server) 是由 klei 官方提供的一个工具,购买饥荒联机版后,在 Steam 的“库”页面勾选 “TOOLS” 后就可以看到了。
专用服务器可以在云服务器或 PC 上运行。如果你的电脑配置还可以,并且不要求服务器全天运行,完全可以在自己电脑上搭建专用服务器。
运行专用服务器每个世界大约需要1G
内存,同时运行游戏本身也需要内存,因此内存最好在8G
以上。如图 1 所示,第一个进程是游戏本身,占用了1.2G
的内存,第二个进程是专用服务器,占用了995M
左右的内存。
饥荒存档的构成
使用游戏本身创建的存档最多可以有一个森林和一个洞穴。但是饥荒专用服务器支持一个存档内包含任意多个森林和洞穴。
专用服务器的运行单位是一个世界,而不是一个存档。比如说,一个存档中包括 2 个森林和 2 个洞穴,那么就需要启动 4 个专用服务器的进程实例。当然,你也可以不运行全部的世界,如果你不打算去某个世界,完全可以不启动它。这些进程通过网络通信,由于这种灵活的方式,你完全可以将一个存档中的不同的世界运行在不同的电脑上 (当然一般不需要这么做,除非你的世界太大了以至于一台电脑运行起来吃力)。
唯一的限制是,每个存档必须有且仅有一个主世界 (Master Shard),所有其他的世界都需要绑定到主世界。为了区分,每个世界都有一个唯一的id
,通过给洞穴入口或洞穴出口绑定不同的id
,玩家就可以通过他们在多个世界之间穿越。旺达的溯源表也绑定了世界的id
,因此可以穿越到不同的世界。如图 2 所示,这是一个拥有两个森林和两个洞穴的世界。其中一个森林是主世界,箭头代表可以通过洞穴入口或洞穴出口进出另一个世界。
这个世界对应的存档结构如下:
Show/Hide the code
|
|
可以看出,每个世界都对应一个文件夹。此外,cluster.ini
存放了世界的一些参数设置,cluster_token.txt
里存放了用户的身份令牌 (身份令牌的获取参见下一章)。这些就是一个 存档的完整内容。
也可以去查看~/.klei/DontStarveTogether/$SteamUserID/
目录,如果你在本地创建了存档,那么这个目录下就会有以Cluster_X
格式命名的文件夹,其中X
是此存档在游戏中显示的位置。如图 3 所示,我创建了一个存档,那么此文件夹中就有一个Cluster_1
。
查看目录结构,可以看出我只添加了一个主世界,没有添加洞穴。由于只有在专用服务器上运行的存档才需要cluster_token.txt
,因此这里没有。
Show/Hide the code
|
|
在本地运行专用服务器
准备存档文件
在游戏中创建存档,添加好要启用的模组并设置好世界的参数后生成世界。等待世界生成,进入选人物的步骤后,断开连接。
一定要添加洞穴,否则存档无法在专用服务器中运行。
进入~/.klei/DontStarveTogether/$SteamUserID/
目录,将刚刚创建的存档Cluster_X
(X
是此存档在游戏中显示的位置)移动到~/.klei/DontStarveTogether/
中。
Show/Hide the code
|
|
使用浏览器打开Klei Account,登录自己的Klei
账号,可以使用Steam
登录。登录成功后进入如下页面。
点击导航栏中的游戏
,在游戏列表中点击《饥荒:联机版》的游戏服务器
,如下图所示。
随便起一个名字,点击添加新服务器
,然后复制生成的以pds-g^
开头的代码,如下图所示。
在~/.klei/DontStarveTogether/Cluster_X
中创建cluster_token.txt
文件,内容为刚刚复制的代码。
Show/Hide the code
|
|
至此,存档文件就准备好了。
准备专用服务器和模组
在Steam
中安装Don't Starve Together Dedicated Server
,进入安装目录 (安装目录可以在Steam
的游戏设置中找到)。
如果你的存档添加了模组,则需要修改mods
文件夹下的dedicated_server_mods_setup.lua
文件。专用服务器启动时,会根据这个文件的内容自动更新模组,如果你只在存档中添加了模组但是没有修改这个文件,则模组会添加失败。将需要添加的模组的id
以如下这种格式添加到此文件中即可。
Show/Hide the code
|
|
模组的id
可以通过Steam
创意工坊中的链接查看。在Steam
中模组的详情页面右击空白处,选择Copy Page URL
。链接末尾的?id=
后接的就是它的id
。例如Show Me
的创意工坊链接为https://steamcommunity.com/sharedfiles/filedetails/?id=666155465
,其id
为666155465
。
除了这种方式,还可以查看此存档中主世界目录中的modoverrides.lua
文件,这个文件保存了当前世界启用的模组的设置。格式如下所示,其中workshop-
后接的数字就是模组的id
。
Show/Hide the code
|
|
既然modoverrides.lua
文件已经保存了模组的id
,那么我们就可以使用脚本将所有添加的模组的id
提取出来。如下命令会根据modoverrides.lua
文件自动生成dedicated_server_mods_setup.lua
文件。cd
到modoverrides.lua
所在目录中执行如下命令,然后将生成的文件复制到专用服务器安装目录/mods
文件夹覆盖原有文件即可。
Show/Hide the code
|
|
启动专用服务器
cd
到安装目录中的bin64
文件夹,执行
Show/Hide the code
|
|
-console
指定在游戏中启用控制台。
-cluster
指定存档的名字,这个名字和要运行的存档文件夹名对应。
-shard
指定世界碎片的名字。同样,这个名字也要和世界碎片的文件夹名对应。
在
cluster.ini
中也可以指定一个名称,这个名称是在游戏中玩家看的世界名称。而-cluster
指定的只是文件夹的名称,在游戏中是看不到的。
在云服务器运行专用服务器
购买阿里云或腾讯云提供的云服务器,配置选择1核2G
或者2核4G
即可。安装Debian
或Ubuntu
操作系统,在安全组中开放10888-10999
端口。此处以Debian
为例。
Show/Hide the code
|
|
- 添加
32
位支持
Show/Hide the code
|
|
- 安装依赖
Show/Hide the code
|
|
- 安装
SteamCMD
Show/Hide the code
|
|
- 准备存档文件 这一步骤与上一章中的相同,可以在本地生成存档文件夹,然后上传到服务器。
Show/Hide the code
|
|
- 将以下内容写入
run_server.sh
文件并赋予其执行权限。
Show/Hide the code
|
|
这个脚本是我在Klei
官方提供的脚本的基础上优化修改而来。运行时需要提供存档文件夹的名称作为脚本的第一个参数。脚本将会检查存档文件是否完整,使用SteamCMD
更新专用服务器并根据存档的模组设置文件modoverrides.lua
自动生成dedicated_server_mods_setup.lua
文件。
- 运行脚本
Show/Hide the code
|
|
由于第一次运行时要下载专用服务器,速度会比较慢。当终端输出Sim paused
时就说明启动完毕,可以在游戏中搜索加入了。
可以使用
tmux
或screen
等工具,这样脚本就可以在后台运行了。
多层世界
理论上来说,一个存档中可以添加无数个世界。配置多层世界需要修改存档根目录中的cluster.ini
和每个世界目录中的server.ini
。
首先看一下的cluster.ini
的内容。
TODO 文件内容分析
使用多层世界选择器可以解决给洞穴入口绑定id
的麻烦。类似于路由器的工作方式,玩家选择目标世界,由多层世界选择器将玩家送到对应世界,如图 7 所示。
常见问题
Connecting anonymously to Steam Public…: Retry Retry
无法连接到Steam
的服务器,这一般是由于GFW
,科学上网即可解决。
服务器启动失败: cluster_token.txt do not exist
检查cluster_token.txt
是否存在,内容是否正确。
服务器启动失败: libcurl-gnults.so.4
安装libcurl-gnults
。
全部模组没有添加成功
查看modoverrides.lua
和dedicated_server_mods_setup.lua
是否都存在,内容是否正确。
部分模组没有添加成功
因为网络原因,有时专用服务器会在下载某些模组时失败。如果运行后发现只有一部分模组,一般重新运行专用服务器即可。
游戏大厅内无法搜索到世界
可以通过控制台指令c_connect("xxx.xxx.xxx.xxx",10999,"password")
加入世界,其中第一个参数是服务器的IP
地址,第二个参数是主世界碎片的端口号,第三个参数是世界的密码。