Назад
Як будь-яка бібліотека C++ потрапляє до проєкту Godot
SiTech AI Team2 წთ. საკითხავი

Як будь-яка бібліотека C++ потрапляє до проєкту Godot

Посібник, опублікований у блозі Conan, пояснює, як будь-яка бібліотека C/C++ інтегрується в проєкт Godot через GDExtension і godot-cpp 10. У прикладі ECS-бібліотека flecs керує 100 000 частинок на одній сцені.

Godot — це безкоштовний рушій для ігор з відкритим кодом за ліцензією MIT, а більшість проєктів пишеться на GDScript. Рано чи пізно виникає потреба у функціоналі, який уже існує як бібліотека C або C++. GDScript не може викликати native-код, Godot підключає його через GDExtension, а godot-cpp, офіційні C++ bindings, подає цей код як звичайні класи рушія.

Посібник у блозі Conan пояснює цей шлях: godot-cpp 10 тепер є в ConanCenter, а в прикладі ECS-бібліотека flecs керує 100 000 частинок на сцені.

Як Godot розширюється кодом C++

Проєкт Godot складається зі сцен, дерев node, а поведінка додається скриптом, прикріпленим до node. Код C++ додають двома способами: engine module компілюється всередині рушія, але потребує власного збирання Godot для всіх платформ, тоді як GDExtension завантажує shared-бібліотеку в офіційний Godot під час runtime і взаємодіє через стабільний C-інтерфейс.

Godot-ის Create New Node დიალოგი, სადაც Swarm კლასი Node2D-ის ქვეშ ჩანს

Збирання — складна частина

godot-cpp загортає verbose C-інтерфейс у C++ API. Починаючи з 10-ї версії, один реліз працює з усіма версіями Godot від 4.3, версія вибирається опцією api_version, а розширення компілюється під одну з трьох target. Документація пропонує додавати godot-cpp як git submodule, але тоді кожен проєкт сам збирає бібліотеки для кожної платформи.

Conan бере на себе залежності

У ConanCenter рецепт godot-cpp перетворює ці bindings на звичайний пакет: api_version (від 4.3 до 4.7, типово 4.7) і target є опціями Conan. Кожна комбінація збирається один раз і потім обслуговує всі проєкти. У ConanCenter понад 1 900 бібліотек, і Conan збирає всі однаково.

100 000 частинок із flecs

У прикладі GDExtension реєструє новий node Swarm, який керує 100 000 частинок на flecs: вони тікають від мишки та відштовхуються від країв. В ECS entity — це простий id, component — дані, прикріплені до нього, а system — функція, яка проходить усіма відповідними entity. Component-и одного типу зберігаються разом у пам’яті, тому перехід багатьма entity є швидким.

Godot-ის editor-ი Swarm node-ისა და Count, Flee Radius თვისებებით

На кожному кадрі _process() передає flecs позицію мишки, запускає system-и через world.progress() і копіює позиції в buffer MultiMesh: MultiMesh малює багато instance одного mesh за один draw call, бо окремий node для 100 000 частинок є надто важким. Клас реєструється через GDREGISTER_RUNTIME_CLASS, тобто в editor він лише placeholder.

Збирання виконується однією командою: conan build . --build=missing. Conan знаходить godot-cpp і flecs, завантажує готові бінарники з ConanCenter і збирає розширення. godot-cpp потребує C++17, тому до старого профілю додається -s compiler.cppstd=17.

SSiTech

SiTech — веброзробка з підтримкою AI

Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.