Портирование на новую платформу
Обнаружение платформы, системный слой, драйверы, экспортёр и проверка на устройстве.
Порт платформы добавляет поддержку новой ОС или устройства в нативную сборку Reckfell. Это работа с C++, SDK целевой системы и сборщиком SCons. Для обычной игры на поддерживаемой платформе порт не нужен: используйте экспорт.
Сначала определите результат
Разделяйте три задачи: запуск приложения на устройстве, сборка экспортного шаблона и экспорт из редактора на компьютере разработчика. Наличие первой не обеспечивает две остальные. Поддержка C# также требует рабочего .NET для целевой платформы; один нативный порт её не добавляет.
Собирайте в отдельной копии исходников. Не заменяйте установленный редактор и рабочие шаблоны до проверки нового бинарного файла. Общие требования и известное ограничение локальных помощников SCons описаны в руководстве по сборке.
Как сборщик обнаруживает платформу
Все пути ниже указаны относительно каталога Source. Идентификатор берётся из имени папки: platform/my_platform соответствует platform=my_platform.
| Файл или функция | Что требуется |
|---|---|
platform/my_platform/detect.py | Без него каталог не участвует в обнаружении платформ. |
can_build() | Без аргументов. Возвращает, доступна ли сборка на текущем хосте. Избегайте побочных эффектов: вызывается при обнаружении платформ. |
get_opts() | Опции SCons этой платформы. Вызывается, если can_build() вернул истину. |
get_flags() | Значения опций платформы; для нового порта используйте словарь. |
configure(env) | Настройка выбранной платформы: компилятор, SDK, архитектура, include-пути и линковка. |
platform/my_platform/SCsub | Список исходников и создание целевого исполняемого файла или библиотеки. |
is_active() текущим циклом обнаружения не вызывается. get_name() есть в штатных портах, но не выбирает идентификатор для platform=…. Не копируйте старый шаблон detect.py без сравнения с текущим SConstruct и ближайшим рабочим портом.
Что реализовать
- Жизненный цикл. Точка входа создаёт реализацию
OS, вызываетMain::setup, затемMain::startи цикл приложения, после чегоMain::cleanup. Обработайте ошибки запуска и код завершения. Образец:platform/linuxbsd/reckfell_linuxbsd.cpp. - Системные службы. Сверьте все чисто виртуальные методы
core/os/os.h, а не только инициализацию: нужны время, файловая среда, процессы, энтропия и другие операции. Для UNIX-подобной системы изучитеdrivers/unix/os_unix.h. Возможность запустить headless-режим ещё не подтверждает вывод изображения. - Окно и ввод. Реализация
DisplayServer, события клавиатуры, мыши, сенсорного экрана и контроллеров по возможностям устройства. Эталон контракта:servers/display/display_server.h. - Графика и звук. Подключите поддерживаемый устройством драйвер и создайте контекст или поверхность. В исходниках есть
drivers/vulkan,drivers/d3d12,drivers/metal,drivers/gles3; наличие каталога не гарантирует совместимость с вашим SDK. Аудиодрайвер проверяйте отдельно. - Шаблон и упаковка. Подготовьте целевые шаблоны, библиотеки, ресурсы и необходимые устройству метаданные. Пустой проект должен запускаться из готового пакета, а не только из дерева исходников.
Не переносите всё сразу. Сначала добейтесь предсказуемого запуска и завершения без окна, затем окна и ввода, потом рендера, звука и упаковки. Недоступные возможности должны возвращать понятный результат, а не имитировать успешное выполнение.
Экспортёр и API платформы
Экспортёр работает внутри редактора на хосте. SConstruct обнаруживает его по platform/my_platform/export/export.cpp; editor/SCsub добавляет C++-файлы из export/. Сверьте export.h, export.cpp и export_plugin.* рабочего порта. В LinuxBSD регистрация использует register_linuxbsd_exporter_types() и register_linuxbsd_exporter().
Иконки штатного экспортёра находятся в platform/linuxbsd/export/logo.svg и run_icon.svg. platform/SCsub генерирует заголовки из SVG в export/; корневая platform/my_platform/logo.svg сама по себе не подключает иконку. Регистрацию, пути и использование сгенерированных символов должен обеспечить ваш экспортёр.
Необязательные общие API обнаруживаются по platform/my_platform/api/api.cpp. Генератор ожидает api/api.h, register_my_platform_api() и unregister_my_platform_api(). Не добавляйте эти файлы ради пустой заглушки: они нужны, когда порт действительно предоставляет такие API.
Приёмка порта
| Проверка на целевом устройстве | Что должно быть подтверждено |
|---|---|
| Запуск и завершение | Ошибки загрузки видны в журнале, код выхода корректен, повторный запуск работает. |
| Данные | Чтение ресурсов, запись в пользовательский каталог, повторное чтение после перезапуска. |
| Окно и ввод | Размер и масштаб, фокус, закрытие, ввод и переподключение поддерживаемых устройств. |
| Графика и звук | Реальный кадр и звук на устройстве, пауза и восстановление, корректные драйверы и материалы. |
| Экспорт | И debug-, и release-пакет запускаются без редактора и папки исходников. |
| C#, если заявлен | Сборка и запуск управляемого проекта на устройстве с целевой средой .NET. |
Измеряйте память, время запуска и производительность на конкретном устройстве и проекте. Универсального обещания по памяти или уровню графики для нового порта нет.
Статья сверена с текущими исходниками. Отдельно проверен алгоритм обнаружения платформ на изолированных тестовых каталогах. Новый порт, SDK устройства, нативная сборка и перечисленная приёмка здесь не выполнены.