Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Спеціальні порти платформи

Подібно до Спеціальні модулі в C++, багатоплатформна архітектура Godot розроблена таким чином, що дозволяє створювати порти платформи без змінення існуючого вихідного коду.

Прикладом спеціального порту платформи, який розповсюджується незалежно від двигуна, є FRT, який націлений на одноплатні комп’ютери. Зауважте, що цей порт платформи наразі націлений на Godot 3.x; отже, він не використовує абстракцію DisplayServer, яка є новою в Godot 4.

Деякі причини для створення спеціальних портів платформи можуть бути:

  • Ви хочете портувати свою гру на консолі (див. також вебсайт Godot про підтримку консолей), але хочете самостійно написати платформний рівень. Це довгий і складний процес, оскільки він вимагає підписання угод про нерозголошення з виробниками консолей, але дозволяє вам повністю контролювати процес портування на консоль.

  • Ви хочете перенести Godot на екзотичну платформу, яка зараз не підтримується.

Якщо у вас є запитання щодо створення спеціального порту платформи, не соромтеся запитати на каналі #platforms у чаті учасників Godot.

Примітка

Godot – сучасний двигун із сучасними вимогами. Навіть якщо ви збираєтеся запускати лише прості 2D-проекти на цільовій платформі, це все одно потребує такої кількості пам’яті, що робить її нежиттєздатною для запуску на більшості ретро-консолей. Для довідки, у Godot 4 порожній проект, у якому нічого не видно, вимагає приблизно 100 МБ оперативної пам’яті для роботи в Linux (50 МБ у безголовому режимі).

Якщо ви бажаєте запускати Godot на платформах із великими обмеженнями пам’яті, старіші версії Godot мають менші вимоги до пам’яті. Процес перенесення подібний, за винятком того, що DisplayServer не відокремлено від єдиного елемента class_OS.

Офіційні порти платформи

Офіційні порти платформи можна використовувати як довідкові під час створення спеціального порту платформи:

Хоча код платформи зазвичай самодостатній, з цього правила є винятки. Наприклад, аудіодрайвери, які є спільними для кількох платформ, і драйвери візуалізації знаходяться в папці drivers/ вихідного коду Godot.

Створення спеціального порту платформи

Створення спеціального порту платформи — це велика справа, яка потребує попереднього знання SDK платформи. Залежно від того, які функції вам потрібні, обсяг необхідної роботи змінюється:

Необхідні функції порту платформи

Принаймні, порт платформи повинен мати методи з синглтона class_OS, реалізовані, щоб їх можна було побудувати та використовувати для автономної роботи. Векторне зображення logo.svg (32×32) також має бути в папці платформи. Цей логотип відображається в діалоговому вікні експорту для кожного стилю експорту, націленого на відповідну платформу.

Перегляньте цю реалізацію для платформи Linux/*BSD як приклад. Дивіться також Singleton заголовок ОС для довідки.

Примітка

Якщо ваша цільова платформа є UNIX-подібною, подумайте про успадкування від класу OS_Unix, щоб виконувати більшу частину роботи автоматично.

Якщо платформа не схожа на UNIX, ви можете використовувати порт Windows як довідник.

detect.py file

Файл detect.py має бути створений у папці платформи з усіма реалізованими методами. Цей файл потрібен SCons, щоб визначити платформу як дійсний варіант для компіляції. Як приклад дивіться файл detect.py для платформи Linux/*BSD.

Усі методи мають бути реалізовані в detect.py наступним чином:

  • is_active(): можна використовувати для тимчасового вимкнення створення для платформи. Загалом це має завжди повертати True.

  • get_name(): повертає видиму користувачу назву платформи у вигляді рядка.

  • can_build(): повертає True, якщо хост-система може створювати для цільової платформи, False інакше. Не встановлюйте тут повільні перевірки, оскільки це запитується, коли користувач запитує список платформ. Замість цього використовуйте configure() для розширеної перевірки залежностей.

  • get_opts(): повертає список параметрів збірки SCons, які користувач може визначити для цієї платформи.

  • get_flags(): Повертає список перевизначених прапорів SCons для цієї платформи.

  • configure(): Виконайте конфігурацію збірки, наприклад вибір параметрів компілятора залежно від вибраних параметрів SCons.

Додаткові функції порту платформи

На практиці роботи без голови недостатньо, якщо ви хочете бачити щось на екрані та керувати пристроями введення. Вам також може знадобитися аудіовихід для більшості ігор.

Деякі посилання в цьому списку вказують на реалізацію платформи Linux/*BSD як посилання.

  • Один або кілька DisplayServers з реалізованими методами вікон. DisplayServer також охоплює такі функції, як підтримка миші, підтримка сенсорного екрану та драйвер планшета (для введення пером). Дивіться Singleton заголовок DisplayServer для довідки.

    • Для платформ, які не мають повної підтримки вікон (або якщо це не стосується порту, який ви створюєте), більшість функцій вікон можна залишити здебільшого нереалізованими. Ці функції можна змусити лише перевіряти, чи ідентифікатор вікна має значення MAIN_WINDOW_ID, і певні операції, такі як зміна розміру, можуть бути пов’язані з функцією роздільної здатності екрана платформи (якщо доречно). Будь-які спроби створити або маніпулювати іншими ідентифікаторами вікон можуть бути відхилені.

  • Якщо цільова платформа підтримує відповідні графічні API: Відтворення контексту для Vulkan, Direct3D 12 OpenGL 3.3 або OpenGL ES 3.0.

  • Обробники введення для клавіатури і контролера.

  • Один або кілька аудіодрайверів <https://github.com/godotengine/godot/blob/master/drivers/pulseaudio/audio_driver_pulseaudio.cpp>`__. Аудіодрайвер можна знайти в папці platform/ (це робиться для платформ Android і Web) або в папці drivers/, якщо цей аудіодрайвер може використовуватись на кількох платформах. Для довідки перегляньте Singleton заголовок AudioServer.

  • Обробник збоїв, для друку зворотних слідів збоїв, коли гра вилітає. Це спрощує пошук несправностей на платформах, де журнали недоступні.

  • Драйвер перетворення тексту в мову (для доступності).

  • Обробник експорту (для експорту з редактора, включаючи Розміщення в один клік). Не потрібно, якщо ви збираєтеся експортувати лише PCK із редактора, а потім запустіть двійковий файл шаблону експорту безпосередньо, перейменувавши його відповідно до файлу PCK. Перегляньте заголовок EditorExportPlatform для довідки. run_icon.svg (16×16) має бути присутнім у теці платформи, якщо Розміщення в один клік реалізовано для цільової платформи. Цей значок відображається у верхній частині редактора, якщо для цільової платформи налаштовано розгортання одним клацанням миші.

Якщо цільова платформа не підтримує запуск Vulkan, Direct3D 12, OpenGL 3.3 або OpenGL ES 3.0, у вас є два варіанти:

  • Використовуйте бібліотеку під час виконання для перекладу викликів Vulkan або OpenGL в інший графічний API. Наприклад, MoltenVK використовується в macOS для перекладу Vulkan на Metal під час виконання.

  • Створіть новий рендерер з нуля. Це велике завдання, особливо якщо ви хочете підтримувати як 2D, так і 3D візуалізацію з розширеними функціями.

Розповсюдження спеціального порту платформи

Небезпека

Перш ніж розповсюджувати спеціальний порт платформи, переконайтеся, що вам дозволено розповсюджувати весь код, який посилається. Пакети SDK для консолі зазвичай підпадають під дію NDA, що запобігає повторному розповсюдженню серед громадськості.

Порти платформи розроблені таким чином, щоб бути максимально автономними. Більшу частину коду можна зберігати в одній папці, розташованій у platform/. Подібно до Спеціальні модулі в C++, це дозволяє оптимізувати процес збирання, дозволяючи git clone теки платформи в папці platform/ клону сховища Godot, а потім запустити scons platform=< ім'я>. Жодних інших кроків для створення не потрібно, окрім випадків, коли спочатку потрібно інсталювати сторонні залежності для певної платформи.

Однак, якщо потрібен спеціальний драйвер візуалізації, необхідно додати іншу папку в drivers/. У цьому випадку порт платформи може бути розповсюджений як розгалуження репозиторію Godot або як набір із кількох папок, які можна додати через клон сховища Godot Git.