为专用服务器导出

如果要在没有 GPU 或没有显示服务器的机器上为项目运行专用服务器,你需要在运行 Godot 的时候使用 headless 显示服务器和 Dummy 音频驱动

从Godot 4.0开始,这可以透过在任何平台上使用 --headless 命令行参数来执行Godot二进位档案或执行导出为专用服务器的项目来完成。与Godot 3.x不同,你不再需要使用专门的服务器二进位。

编辑器与导出模板

可以在无头模式下使用编辑器或导出模板(调试或发布)二进位。你应该使用哪一种取决于你的用例:

  • Export template(导出模板):不包含编辑器的功能,体积更小、优化更高,是在服务器平台下的最佳选择。

  • Editor(编辑器):包含编辑器功能的可执行文件,目的是用来导出项目。该可执行文件可以用来运行专用服务,但是因为其体积较大、优化程度较低,所以不建议将其作为专用服务器使用。

导出方法

针对服务器导出项目的方法有两种:

  • 为服务器托管平台创建单独的导出预设,然后像往常一样导出项目。

  • 仅导出PCK档案,最好是与将托管服务器的平台相配对的平台。将此PCK档案放在与导出模板二进位档案相同的文件夹中,将二进位档案重新命名为与PCK相同的名称(减去文件扩展名),然后执行该二进位档案。

两种方法的输出结果应该相同。本页其余部分将重点介绍第一种方法。

详见 导出项目 .

为专用服务器导出项目

如果你在以服务器为目标时像往常一样导出项目,你会注意到 PCK 文件与客户端一样大。这是因为它包含所有资源,其中包括服务器不需要的资源(例如纹理数据)。此外,不会自动使用无头模式;用户必须指定 --headless 以确保不会生成任何窗口。

许多资源(例如纹理)可以从PCK档案中剥离,以大大减少其大小。Godot提供了一种对纹理和材质执行此操作的方法,可保留场景或资源档案(内置或外部)中的参考。

首先,请确保你的服务器有专用的导出预设,然后选择它,转到其**Resources**标签并更改其导出模式:

在导出预设中选择**导出为专用服务器**导出模式

在导出预设中选择**导出为专用服务器**导出模式

选择此导出模式后,dedicated_server 功能标记将自动新增至导出的项目。

备注

如果你不想使用该导出模式但仍想要功能标签,则可以在导出预设的功能选项卡中写入名称 dedicated_server。这也会在运行导出的项目时强制使用 --headless

选择此导出模式后,你将看到项目中的资源列表:

选择要保留的资源、保留剥离的视觉效果或删除

选择要保留的资源、保留剥离的视觉效果或删除

勾选复选框可让你复写指定档案或文件夹的选项。复选框**不会**影响导出哪些档案;这是透过为每个复选框选择的选项来完成的。

预设情况下,提取文件夹中的档案将自动使用父级选项,这由选项名称的**(Inherited)**后缀表示(并且选项名称呈灰色)。若要变更目前继承选项的档案的选项,必须先勾选该档案旁的方块。

  • Strip Visuals:导出此资源,其中的视觉文件(纹理和材质)被占位符类替换。占位符类存储图像大小(有时用于在 2D 场景中定位元素),但不存储其他内容。

  • Keep:照常导出此资源,并保留完整的视觉文件。

  • Remove:该文件不包含在 PCK 中。这对于忽略只有客户端需要的场景和资源很有用。如果这样做,请确保服务器不会以任何方式引用这些仅限客户端的场景和资源。

一般建议尽可能使用 Strip Visuals,除非服务器需要访问图像数据(例如像素颜色)。例如,如果你的服务器根据图像的内容生成碰撞数据,则需要对该特定图像使用 Keep

小技巧

要检查导出的 PCK 的文件结构,请使用导出 PCK/ZIP…按钮并指定 .zip 文件扩展名,然后在文件管理器中打开得到的 ZIP 文件。

警告

使用**Remove**模式时要小心,因为引用已删除档案的场景/资源将无法再成功加载。

如果想要移除特定的资源,并且希望场景仍然能够正常加载,你就必须移除场景文件中的相关引用,在脚本中使用 load() 为节点的属性加载这些文件。Godot 不支持将音频之类的资源替换为占位符,但可以用这种方法来剥离。

移除纹理通常会对 PCK 大小影响最大,因此建议先坚持使用 Strip Visuals

使用上面的选项后,客户端的 PCK(正常导出所有资源)是这样的:

.
├── .godot
│   ├── exported
│   │   └── 133200997
│   │       └── export-78c237d4bfdb4e1d02e0b5f38ddfd8bd-scene.scn
│   ├── global_script_class_cache.cfg
│   ├── imported
│   │   ├── map_data.png-ce840618f399a990343bfc7298195a13.ctex
│   │   ├── music.ogg-fa883da45ae49695a3d022f64e60aee2.oggvorbisstr
│   │   └── sprite.png-7958af25f91bb9dbae43f35388f8e840.ctex
│   └── uid_cache.bin
├── client
│   ├── music.ogg.import
│   └── sprite.png.import
├── server
│   └── map_data.png.import
├── test
│   └── scene.gd
└── unused
│   └── development_test.gd
├── project.binary
├── scene.gd
├── scene.tscn.remap

服务器的 PCK 文件结构是这样的:

.
├── .godot
│   ├── exported
│   │   └── 3400186661
│   │       ├── export-78c237d4bfdb4e1d02e0b5f38ddfd8bd-scene.scn
│   │       ├── export-7958af25f91bb9dbae43f35388f8e840-sprite.res  # Placeholder texture
│   │       └── export-fa883da45ae49695a3d022f64e60aee2-music.res
│   ├── global_script_class_cache.cfg
│   ├── imported
│   │   └── map_data.png-ce840618f399a990343bfc7298195a13.ctex
│   └── uid_cache.bin
├── client
│   ├── music.ogg.import
│   └── sprite.png.import  # Points to placeholder texture
└── server
│   └── map_data.png.import
├── project.binary
├── scene.gd
├── scene.tscn.remap

启动专用服务器

如果你的客户端和服务器都是同一个 Godot 项目的一部分,则必须添加一种使用命令行参数直接启动服务器的方法。

如果你使用导出为专用服务器导出模式 导出了该项目(或已添加 dedicated_server 作为自定义功能标记),则可以使用 dedicated_server 功能标签来检测是否正在使用专用服务器 PCK:

# Note: Feature tags are case-sensitive.
if OS.has_feature("dedicated_server"):
    # Run your server startup code here...
    pass

如果你还希望在使用内置的 --headless 命令行参数时托管服务器,可以在主场景(或自动加载)的 _ready() 方法中添加以下代码段来实现:

if DisplayServer.get_name() == "headless":
    # Run your server startup code here...
    #
    # Using this check, you can start a dedicated server by running
    # a Godot binary (editor or export template) with the `--headless`
    # command-line argument.
    pass

如果希望使用自定义命令行参数,可在主场景(或自动加载)的 _ready() 方法中添加以下代码段:

if "--server" in OS.get_cmdline_user_args():
    # Run your server startup code here...
    #
    # Using this check, you can start a dedicated server by running
    # a Godot binary (editor or export template) with the `--server`
    # command-line argument.
    pass

最好新增至少一个上述命令列参数来启动服务器,因为它可用于从命令列测试服务器功能,而无需导出项目。

如果你的客户端和服务器是独立的Godot项目, 服务器通常应该配置成运行主场景时自启服务的方式.

下一步

在Linux上, 为了让你的专用服务在崩溃或系统重启后重新启动, 你可以 创建一个系统服务 . 这也可以更方便的查看服务器日志, 系统提供的日志自动轮询功能.

如果你有容器的经验, 可以考虑将专用服务器包装在一个 Docker 容器中. 这样, 在弹性配置中可以更容易地使用它(这不在本教程的范围内).