This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Запуск проєкту в режимі Debug створює процес для певного екземпляра середовища виконання рушія з вашою грою та спеціальним сервісом рушія, доступним для інфраструктури розробки й профілювання, логіки та повідомлень середовища виконання, стану рушія й розширень.
Сервіс рушія — це HTTP-сервіс розробки, що належить запущеному налагоджувальному рушію або рушію без графічного інтерфейсу (dmengine чи dmengine_headless).
Він відокремлений від сервера редактора, який належить редактору Defold і керує відкритим проєктом.
Два сервіси використовують різні порти. Інструмент, підключений до порту редактора, не може викликати там маршрути розширень середовища виконання, і навпаки — інструмент, підключений до сервісу рушія, не може викликати операції редактора.
Сервіс рушія є частиною інфраструктури налагодження, розробки й профілювання. Екземпляри рушія у збірках випуску не створюють цей сервіс.
Коли редактор запускає налагоджувальний рушій, він запитує динамічно призначений порт сервісу. Рушій повідомляє вибраний порт на панелі Console та у своєму журналі, якщо його запущено з CLI:

INFO:ENGINE: Engine service started on port <port>
Рушій також записує в журнал повний URL виявлення OpenAPI з фактичною адресою й призначеним портом:
INFO:ENGINE: OpenAPI: http://<address>:<port>/openapi.json
Ці рядки з’являються в консолі редактора, коли гру запущено з редактора. Простий локальний контролер може аналізувати їх, але інтеграція для повторного використання повинна давати змогу редактору або його обгортці відстежувати екземпляр рушія й зареєстрований порт. Це дає змогу не сплутати старий порт із щойно запущеним або повторно використаним процесом.
Рушій також оголошує цілі розробки через виявлення сервісів на підтримуваних платформах. Цей механізм переважно використовується інструментами Defold, і його не слід замінювати постійно жорстко закодованим портом.
Сервер доступний на localhost (127.0.0.1) за певним портом:

GET /openapi.json повертає документ OpenAPI 3.0.3, який описує HTTP API середовища виконання. Використовуйте порт сервісу рушія з журналу. Для локального рушія замініть <port> нижче на цей порт:
ENGINE_URL="http://127.0.0.1:<port>"
curl -fsS "$ENGINE_URL/openapi.json" | jq
Документ описує шляхи, методи, параметри, тіла запитів і відповіді поточних зареєстрованих обробників, зокрема нативних розширень, що надають метадані OpenAPI. Його об’єкт paths змінюється під час додавання або видалення обробників. Маршрути профайлера й розширень залежать від платформи, конфігурації та зареєстрованих розширень запущеного рушія, тому отримуйте документ саме з екземпляра, яким користуєтеся.
Обробники, зареєстровані без метаданих OpenAPI, залишаються доступними для виклику, але не з’являються в документі. Задокументований маршрут також може повідомляти про недоступну можливість; перед використанням залежних від платформи операцій перевіряйте описи відповідей і кінцеві точки можливостей.
Редактор має власний документ OpenAPI на порту редактора. Для операцій середовища виконання використовуйте документ рушія.
Поточний налагоджувальний рушій реєструє невеликий набір основних маршрутів.
| Кінцева точка | Призначення |
|---|---|
GET /openapi.json |
Виявити поточні зареєстровані операції HTTP середовища виконання, які надають метадані OpenAPI |
GET /ping |
Перевірити, чи відповідає сервіс рушія |
GET /info |
Прочитати версію рушія, платформу, ідентифікатор збірки й інформацію про сервіс журналювання |
GET /state |
Прочитати стан підключення для розробки, який використовують інструменти Defold |
POST /post/<socket>/<message-type> |
Надіслати закодоване в Protobuf повідомлення Defold до іменованого сокета рушія |
Наприклад:
curl -sS "$ENGINE_URL/ping"
curl -sS "$ENGINE_URL/info" | jq
curl -sS "$ENGINE_URL/state" | jq
Маршрут /post використовується операціями розробки, як-от гаряче перезавантаження, перезапуск, змінення розміру та керування процесом. Його тіло — це двійкове повідомлення Protobuf типу, названого в маршруті; це не API повідомлень JSON. Розмір серіалізованого повідомлення Protobuf не може перевищувати 1024 байти, інакше буде повернуто 400 Too large message.
Ці маршрути належать до інфраструктури розробки, а в реалізації рушія також є додаткові маршрути профілювання й інспектування ресурсів.
Налагоджувальні рушії для настільних платформ також надають нативний запис MP4 через такі маршрути. Їх виключено зі збірок випуску, збірок без графічного інтерфейсу, мобільних і вебзбірок, а також коли в маніфесті застосунку ввімкнено Exclude Record.
| Кінцева точка | Призначення |
|---|---|
GET /recording/capabilities |
Виявити підтримку відео/аудіо, вимоги бекенду та instance_id сервісу запису |
GET /recording/status |
Прочитати поточну операцію, перебіг асинхронної роботи й інформацію про завершений файл |
POST /recording/start |
Запросити запис і отримати його operation_id |
POST /recording/stop |
Запросити зупинення й завершення зазначеної операції |
GET /recording/files/{id} |
Завантажити завершений MP4 |
DELETE /recording/files/{id} |
Видалити завершений файл, що зберігається в сервісі |
Виявіть ці маршрути через /openapi.json, а потім перевірте підтримку поточної платформи через /recording/capabilities. Операції змінення запису потребують заголовка X-Recording-Instance, а зупинення — також прийнятого operation_id. Запуск і зупинення асинхронні; дочекайтеся завершення, перш ніж завантажувати файл. Повний процес див. у посібнику із запису відео.
HTTP-сервіс спільно використовує засіб запису з Lua. Запуски через HTTP за замовчуванням вмикають аудіо застосунку, якщо воно підтримується; запуски через Lua типово записують лише відео. Лише записи, запущені через HTTP, мають квитанцію file для завантаження. Перед завантаженням дочекайтеся pending: false, finalized: true і file.state: "complete", а потім перевірте розмір і SHA-256 файлу. Про поєднання клієнтів Lua й HTTP див. розділ Спільне використання засобу запису.
У macOS налагоджувальні рушії надають /profiler/gputrace для захоплення трас GPU Metal. Маршрут з’являється в /openapi.json лише на macOS. Захоплення потребує нативного адаптера Metal і METAL_CAPTURE_ENABLED=1 у середовищі запуску рушія. Якщо захоплення недоступне, запит повертає HTTP 501 з error.code: "gputrace_unsupported".
| Кінцева точка | Призначення |
|---|---|
POST /profiler/gputrace |
Запланувати захоплення до доступного для запису абсолютного шляху .gputrace; frames типово дорівнює 1 і може бути 1–10000. |
GET /profiler/gputrace |
Прочитати стан, шлях і кількість кадрів поточного або останнього захоплення. |
DELETE /profiler/gputrace |
Скасувати очікуване захоплення або завершити активне після поточного відрендереного кадру; зберегти трасу на диску. |
Прийняті запити повертають HTTP 200 з ok: true і об’єктом data. Захоплення відбувається асинхронно: опитуйте GET, доки data.state не стане complete, canceled або failed. Помилки нативного запуску повідомляються в data.error. Траса записується на комп’ютері рушія. Команди запуску, виявлення підтримки, приклади захоплення й відкриття результату в Xcode див. у посібнику із захоплення трас GPU Metal.
У налагоджувальних збірках SDK нативних розширень може надавати доступ до вебсервера рушія. Розширення може зареєструвати префікс маршруту на цьому сервері й відкрити операції, що залежать від даних середовища виконання.
Це корисно для інструментів розробки, оскільки розширення може спільно використовувати наявний сервіс рушія замість відкриття ще одного HTTP-сервера.
Визначений розширенням API автоматизації середовища виконання повинен:
У зворотному виклику ініціалізації застосунку нативного розширення отримайте сервер через dmEngine::GetWebServer(app_params) і реєструйте обробники лише тоді, коли повернений дескриптор не дорівнює null. Налаштування зворотного виклику див. у розділі Життєвий цикл розширення.
Перевантаження dmWebServer::AddHandler() із чотирма аргументами приймає об’єкт Paths Object OpenAPI 3.0.3 як рядок JSON. Ключами верхнього рівня об’єкта є шляхи маршрутів. Кожен шлях має починатися із зареєстрованого префікса й не бути вже задокументованим іншим обробником. Використовуйте вбудовані схеми або посилання на шляхи в кінцевому документі.
Наприклад, ця допоміжна функція реєструє зворотний виклик і опис його кінцевої точки стану:
#include <dmsdk/dlib/webserver.h>
static const char STATUS_OPENAPI[] = R"json(
{
"/example/v1/status": {
"get": {
"summary": "Get extension status",
"responses": {
"200": {
"description": "Current extension status",
"content": {
"text/plain": {
"schema": { "type": "string" }
}
}
}
}
}
}
}
)json";
dmWebServer::Result RegisterStatusHandler(dmWebServer::HServer server,
dmWebServer::Handler callback,
void* context)
{
dmWebServer::HandlerParams params;
params.m_Handler = callback;
params.m_Userdata = context;
return dmWebServer::AddHandler(
server, "/example/v1", ¶ms, STATUS_OPENAPI);
}
Передайте зворотний виклик, який реалізує GET /example/v1/status і повертає задокументовану відповідь text/plain. Зворотний виклик і далі відповідає за перевірку шляхів і методів запитів та формування відповідей. Перевіряйте результат реєстрації: некоректні або конфліктні метадані повертають dmWebServer::RESULT_ERROR_INVAL.
Сервер зберігає вказівник JSON, не копіюючи рядок. Його пам’ять має залишатися незмінною й дійсною, доки обробник не буде видалено через dmWebServer::RemoveHandler() або сервер не буде знищено. Масив static const char у прикладі відповідає цій вимозі. Видалення обробника також вилучає його шляхи з наступних відповідей /openapi.json.
Перевантаження dmWebServer::AddHandler(server, prefix, ¶ms) із трьома аргументами залишається підтримуваним. Воно еквівалентне передаванню 0 як четвертого аргументу: обробник реєструється без метаданих OpenAPI й не бере участі у виявленні.
Офіційний Automation Bridge від Defold — це нативне розширення лише для налагодження, побудоване на сервісі рушія. Воно реєструє версійований API автоматизації середовища виконання за адресою:
http://127.0.0.1:<engine-service-port>/automation-bridge/v1
Його API середовища виконання надає такі можливості, як інспектування сцен і вузлів, введення, інформація про екран, знімки екрана, записування, інформація про життєвий цикл і необов’язкова визначена застосунком синхронізація. Деякі операції:
| Операція | Дія |
|---|---|
GET /automation-bridge/v1/health |
Звіт про стан, можливості й сумісність API |
POST /automation-bridge/v1/input/click |
Взаємодії введення в середовищі виконання |
GET /automation-bridge/v1/screenshot |
Знімки екрана середовища виконання |
Використовуйте документацію нативного API розширення та документацію допоміжних засобів Python для версії, установленої в проєкті.
Automation Bridge не відкриває ані HTTP API, ані модуль Lua у збірках випуску.
Допоміжні засоби Python Automation Bridge ілюструють двоклієнтську архітектуру. Функція editor.open_project() повертає клієнт проєкту редактора, а project.build_and_run() повертає окремий клієнт рушія.
| Клієнт | Призначення |
|---|---|
| Проєкт | HTTP API редактора, команди, налагоджувач, консоль, налаштування, довідка, попередні перегляди, збирання й виявлення порту |
| Гра — сервіс рушія | Сцена, введення, знімки екрана, стан середовища виконання й синхронізація |
Поділ між project і game робить межу процесів явною. Операції редактора залишаються на сервері редактора, а спостереження й дії щодо запущеної гри — на сервісі рушія.
from automation_bridge import editor
project = editor.open_project(".")
game = project.build_and_run()
Сервіс рушія й визначені розширеннями маршрути є засобами розробки, і поводитися з ними слід відповідно.
У Defold 1.14.1 і новіших версіях використовуйте документ /openapi.json запущеного рушія для виявлення операцій. Старіші рушії не надають цієї кінцевої точки. Для обробників, зареєстрованих без метаданих OpenAPI, звертайтеся до документації версійованого API розширення.
Скрипти середовища виконання, фізика, введення, динамічно створені об’єкти й платформний рендеринг потребують запущеного рушія й мають перевірятися за допомогою автоматизованого тестування середовища виконання.