Экспортирование на выделенные серверы
Если вы хотите запустить выделенный сервер для своего проекта на машине, на которой нет графического процессора или сервера отображения, вам нужно запустить Godot с headless сервером отображения и Dummy аудиодрайвером.
Начиная с Godot 4.0, это можно сделать, запустив исполняемый файл Godot на любой платформе с аргументом командной строки --headless, или запустив проект, экспортированный как выделенный сервер. В отличие от Godot 3.x, вам больше не нужно использовать специализированный исполняемый файл сервера.
Редактор в сравнении с шаблонами экспорта
В режиме headless можно использовать как редактор, так и исполняемый файл шаблона экспорта (отладочный или релизный). Выбор варианта зависит от вашего варианта использования:
Export template: Используйте этот вариант для работы с выделенными серверами. Он не содержит функций редактора, поэтому меньше по размеру и более оптимизирован.
Editor: Этот исполняемый файл содержит функции редактора и предназначен для экспорта проектов. Его можно использовать для запуска выделенных серверов, но это не рекомендуется, поскольку он больше по размеру и менее оптимизирован.
Экспортные подходы
Есть два способа экспортирования проекта на сервер:
Создайте отдельный шаблон экспорта для платформы, на которой будет размещен сервер, а затем экспортируйте свой проект как обычно.
Экспортируйте только PCK-файл, желательно для платформы, соответствующей платформе, на которой будет размещен сервер. Поместите этот PCK-файл в ту же папку, что и исполняемый файл шаблона экспорта, переименуйте его, чтобы имя совпадало с PCK-файлом (без расширения), а затем запустите его.
Оба метода должны дать одинаковый результат. Остальная часть страницы будет посвящена первому подходу.
Дополнительную информацию смотрите в Экспорт проектов.
Экспорт проекта на выделенный сервер
Если вы экспортируете проект как обычно, ориентируясь на сервер, вы заметите, что файл PCK имеет тот же размер, что и для клиента. Это связано с тем, что он включает в себя все ресурсы, в том числе те, которые не нужны серверу (например, данные текстур). Кроме того, режим headless не будет использоваться автоматически; пользователю потребуется указать --headless, чтобы избежать появления окон.
Многие ресурсы, такие как текстуры, можно удалить из PCK-файла, что значительно уменьшит его размер. Godot предлагает способ сделать это для текстур и материалов, сохраняя ссылки в файлах сцен или ресурсов (встроенных или внешних).
Для начала убедитесь, что у вас есть специальный шаблон экспорта для вашего сервера, затем выберите его, перейдите на вкладку Resources и измените режим экспорта:
Выбор режима экспорта Export as dedicated server в настройках экспорта
При выборе этого режима экспорта тег функции dedicated_server автоматически добавляется в экспортируемый проект.
Примечание
Если вы не хотите использовать этот режим экспорта, но всё же хотите использовать тег функции, вы можете указать имя dedicated_server на вкладке Features шаблона экспорта. Это также приведёт к принудительному использованию --headless при запуске экспортированного проекта.
После выбора этого режима экспорта вам будет представлен список ресурсов проекта:
Выбор ресурсов для сохранения, сохранения с удаленными визуальными эффектами или удаления
Установка флажка позволяет переопределить параметры для указанного файла или папки. Установка флажка not влияет на экспортируемые файлы; это определяется параметрами, выбранными для каждого флажка.
Файлы в отмеченной папке будут автоматически использовать родительский параметр по умолчанию, на что указывает суффикс (Inherited) в названии параметра (и сам параметр отображается серым цветом). Чтобы изменить параметр для файла, параметр которого в данный момент наследуется, необходимо сначала установить флажок рядом с ним.
Strip Visuals: Экспортируйте этот ресурс, заменив визуальные файлы (текстуры и материалы) классами-заполнителями. Классы-заполнители хранят размер изображения (так как он иногда используется для позиционирования элементов в 2D-сцене), но ничего больше.
Keep: Экспортируйте этот ресурс как обычно, не изменяя визуальные файлы.
Remove: Файл не включён в PCK. Это полезно для игнорирования сцен и ресурсов, которые нужны только клиенту. В этом случае убедитесь, что сервер никаким образом не ссылается на эти сцены и ресурсы, предназначенные только для клиента.
Общая рекомендация — использовать Strip Visuals везде, где это возможно, за исключением случаев, когда серверу требуется доступ к данным изображения, таким как цвета пикселей. Например, если ваш сервер генерирует данные о столкновениях на основе содержимого изображения, вам необходимо использовать Keep для этого конкретного изображения.
Совет
Чтобы проверить структуру файла экспортированного PCK, используйте кнопку Export 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, вам придется добавить способ запуска сервера напрямую с помощью аргумента командной строки.
Если вы экспортировали проект с помощью режима экспорта Export as dedicated server (или добавили dedicated_server в качестве тега пользовательской функции), вы можете использовать тег функции dedicated_server для определения того, используется ли PCK выделенного сервера:
# Note: Feature tags are case-sensitive.
if OS.has_feature("dedicated_server"):
# Run your server startup code here...
pass
// Note: Feature tags are case-sensitive.
if (OS.HasFeature("dedicated_server"))
{
// Run your server startup code here...
}
Если вы также хотите разместить сервер при использовании встроенного аргумента командной строки --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
using System.Linq;
if (DisplayServer.GetName() == "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.
}
Если вы хотите использовать пользовательский аргумент командной строки, это можно сделать, добавив следующий фрагмент кода в метод _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
using System.Linq;
if (OS.GetCmdlineUserArgs().Contains("--server"))
{
// 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.
}
Рекомендуется добавить хотя бы один из приведенных выше аргументов командной строки для запуска сервера, поскольку его можно использовать для тестирования функциональности сервера из командной строки без необходимости экспортировать проект.
Если ваш клиент и сервер являются отдельными проектами Godot, ваш сервер, скорее всего, должен быть настроен таким образом, чтобы запуск основной сцены запускал сервер автоматически.
Следующие шаги
В Linux для перезапуска выделенного сервера после сбоя или перезагрузки системы вы можете создать службу systemd. Это также позволяет просматривать журналы сервера в более удобном виде с автоматической ротацией журналов, предоставляемой systemd.
Если у вас есть опыт работы с контейнерами, вы также можете изучить возможность упаковки вашего выделенного сервера в контейнер Docker. Таким образом, его можно будет проще использовать при настройке автоматического масштабирования (что выходит за рамки данного руководства).