Conan показал, как подключать C++-библиотеки к Godot через godot-cpp 10
Команда Conan опубликовала в блоге руководство о том, как использовать C++-библиотеки в играх на движке Godot. Большинство игр на Godot пишут на GDScript, но рано или поздно проекту может понадобиться готовая C- или C++-библиотека: симуляция, база данных, сетевой протокол, среда исполнения для машинного обучения. GDScript не умеет вызывать нативный код, зато Godot может загружать его через GDExtension, а godot-cpp (официальные C++-привязки, которые поддерживает команда Godot) позволяет оформить такой код как обычные классы движка. По словам авторов, писать C++-код проще всего, а сложность, в сборке: godot-cpp должен совпадать с версией Godot, а каждую добавленную библиотеку нужно собирать под каждую платформу поставки.\n\nВ тексте сначала кратко описан сам Godot: универсальный движок для 2D- и 3D-игр, бесплатный, с открытым кодом под лицензией MIT. Всё в проекте строится из узлов (nodes) и сцен (scenes): у узла есть тип, свойства в Инспекторе и обратные вызовы вроде _ready() и _process(); сцена, дерево узлов, сохранённое в файл .tscn. Затем разобраны два способа добавить C++-код. Модули движка компилируются в сам движок и получают полный доступ к внутренностям, но требуют собирать и поставлять собственную копию Godot с редактором и шаблонами экспорта под каждую платформу. GDExtension загружает во время работы разделяемую библиотеку (.dll.so.dylib или .wasm для веба) в официальную, немодифицированную сборку Godot через стабильный C-интерфейс. Авторы называют GDExtension рекомендуемым подходом для большинства проектов. Поскольку C-интерфейс неудобен, команда Godot поддерживает godot-cpp: он даёт C++-класс для каждого класса движка (Node2D, Sprite2D, Input), а собственные классы наследуются от них.\n\nНачиная с версии 10.0 один релиз godot-cpp работает с любой версией Godot от 4.3 и новее. Нужная версия выбирается опцией сборки api_version, и godot-cpp генерирует C++-классы по API этой версии. Расширение, собранное под Godot 4.3, работает и в новых версиях, но не в старых, поэтому обычно берут самую старую версию, которую хотят поддерживать. Кроме того, godot-cpp собирается под одну из трёх целей: template_debug (по умолчанию, с проверками отладки, для редактора и отладочных экспортов), template_release (для релизных экспортов без отладочных проверок) и editor (для библиотек, которые грузит только редактор). Какую библиотеку загрузить, Godot решает во время работы по небольшому файлу .gdextension, где теги возможностей (debug, release) сопоставлены путям к библиотекам для macOS, Linux и Windows.\n\nСтандартный путь по документации Godot, подключить godot-cpp как git-подмодуль и собирать вместе с библиотекой через SCons. Для первого расширения это работает, но каждый проект компилирует свой godot-cpp под каждую цель, платформу и архитектуру, а сторонние библиотеки (например, физический движок или среду для машинного обучения) приходится вносить в репозиторий и собирать с согласованными флагами под все платформы экспорта. Именно такие задачи, пишут авторы, Conan и создавался решать. С рецептом godot-cpp в ConanCenter он становится обычным пакетом, а два упомянутых параметра, опциями Conan: api_version (от 4.3 до 4.7, по умолчанию 4.7) и target (template_debug по умолчанию, template_release или editor). Каждая комбинация собирается один раз и затем переиспользуется всеми проектами. Рядом с godot-cpp можно добавить любую из более чем 1900 библиотек ConanCenter или собственную, упакованную рецептом Conan, и Conan соберёт всё согласованно для каждой целевой платформы.\n\nВ качестве практического примера авторы пишут GDExtension с новым узлом Swarm: он симулирует 100 000 частиц, которые убегают от курсора мыши и отскакивают от краёв окна, и рисует их в сцене Godot. Симуляцию ведёт flecs, библиотека Entity Component System (ECS) для C и C++. В ECS сущности, простые идентификаторы, компоненты, структуры данных, а системы, функции над всеми сущностями с заданным набором компонентов; однотипные компоненты лежат в памяти вместе, что ускоряет перебор большого числа сущностей. Авторы отмечают, что обновлять столько сущностей каждый кадр в C++ намного быстрее, чем в GDScript, но замеров в тексте не приводят. Полный пример лежит в репозитории Conan examples2 (папка examples/libraries/godot-cpp/gdextension): в src, код расширения, в demo, обычный проект Godot.\n\nConanfile примера требует godot-cpp/10.0.0 и flecs/4.1.6; единственная особенность для Godot, в методе generate(): значение опции target зависимости godot-cpp передаётся в CMake как GODOTCPP_TARGET, чтобы имя итоговой библиотеки всегда совпадало с бинарником godot-cpp, с которым она скомпонована. CMakeLists.txt, стандартный проект CMake (минимальная версия 3.15): разделяемая библиотека gdexample статически линкуется с godot-cpp и flecs, поэтому поставлять нужно один файл, а результат пишется прямо в demo/bin. Класс Swarm наследует Node2D и владеет миром flecs; по умолчанию у него count = 100 000 и flee_radius = 150,0, оба свойства через _bind_methods() видны в Инспекторе и из GDScript. В _ready() создаётся по сущности flecs на частицу (компоненты Position и Velocity), система, двигающая частицы, и MultiMesh, он рисует много экземпляров одной сетки одним вызовом отрисовки, поскольку по узлу Godot на каждую из 100 000 частиц было бы слишком тяжело. В каждом кадре _process() передаёт в flecs положение мыши, запускает системы через world.progress() и копирует позиции обратно в буфер MultiMesh. Предоставленный текст обрывается на середине метода _process(), полный код, в репозитории.
Ключевые факты
- Рецепт godot-cpp 10 теперь есть в ConanCenter: godot-cpp становится обычным пакетом Conan, а Godot-расширение, обычным C++-проектом с зависимостями.
- Начиная с godot-cpp 10.0 один релиз работает с любой версией Godot от 4.3; версия API задаётся опцией api_version (4.3, 4.7, по умолчанию 4.7), цель сборки, опцией target (template_debug, template_release, editor).
- Каждая комбинация опций godot-cpp собирается один раз и переиспользуется всеми проектами, а рядом можно подключить любую из более чем 1900 библиотек ConanCenter.
- Пример: узел Swarm на библиотеке flecs (ECS) симулирует 100 000 частиц, которые убегают от мыши; отрисовка через MultiMesh, расширение линкуется статически и поставляется одним файлом.
- Пример доступен в репозитории conan-io/examples2; преимущество C++ над GDScript в скорости авторы заявляют без замеров.
Почему это важно
Сборка нативных расширений для Godot, заметная часть сложности: godot-cpp должен совпадать с версией движка, а каждая сторонняя библиотека собирается под каждую платформу экспорта. Материал показывает, как снять эту нагрузку: godot-cpp в ConanCenter, обычный пакет, а его опции api_version и target заменяют ручную сборку через подмодуль и SCons. Отдельно отмечено, что с версии 10.0 один релиз godot-cpp работает с Godot от 4.3 и новее.
Кому это важно
Разработчикам игр на Godot, которым нужны готовые C- и C++-библиотеки (физика, база данных, сетевой протокол, машинное обучение), а также C++-разработчикам, уже использующим Conan и CMake. Тем, кто пишет только на GDScript и не выходит за рамки встроенных возможностей движка, материал нужен меньше.
Как это применить
Возьмите пример из репозитория conan-io/examples2 (examples/libraries/godot-cpp/gdextension): в conanfile.py укажите godot-cpp/10.0.0 и нужные библиотеки из ConanCenter, а значение опции target передайте в CMake как GODOTCPP_TARGET, чтобы имя библиотеки совпадало с бинарником godot-cpp. Версию API выбирайте по самой старой версии Godot, которую хотите поддерживать (от 4.3 до 4.7). В файле .gdextension сопоставьте теги debug и release путям к библиотекам под каждую платформу. Сведений о цене или лицензии Conan в предоставленном тексте нет; сам Godot бесплатен и распространяется под лицензией MIT.
Можно ли доверять
Материал, публикация из блога самого Conan, то есть написана со стороны проекта, который продвигает свой рецепт в ConanCenter. Технические описания GDExtension, опций godot-cpp и структуры примера конкретны и подкреплены кодом в открытом репозитории. Утверждение, что C++ для такого числа сущностей намного быстрее GDScript, дано без замеров, а текст источника обрывается на середине примера, поэтому итоговые результаты симуляции и сборочные команды в этом пересказе не отражены.
Риски и подводные камни
Расширение, собранное под Godot 4.3, не заработает в более старых версиях, поэтому минимальную поддерживаемую версию нужно выбрать заранее. Пример использует compatibility_minimum = 4.7 и api_version по умолчанию 4.7, для поддержки более старых версий эти значения придётся менять. Пример в тексте упрощён, полный код нужно смотреть в репозитории. Сборка по-прежнему требует настройки под каждую платформу и цель (template_debug, template_release, editor), а имя выходной библиотеки должно совпадать с целью, с которой собран godot-cpp.