Главная » 2018 » Май » 16 » Godot + NW.js
14:29
Godot + NW.js

Моя любовь к Godot с каждым его запуском все усиливается, ровно как и моя тягу к NW.js и JavaScript.
Недавно я решил их подружить... и вот, во что это вылилось.

Небольшое подведение итогов моего общения с Godot.
Создать C++ класс и интегрировать его в Native я не смог. Точнее смог, но не в том виде, в каком планировал. Отлаживать такой код крайне неудобно и проблематично, поскольку с момента внесения изменений (даже самых минимальных) до момента "живого" запуска проходит дофига времени и действий.

Что требовалось: я написал небольшой редактор на Godot Engine, который умеет редактировать проекты NW.js. Встал вопрос о том, как можно запускать и отлаживать проекты NW из среды, написанной на Godot. Очевидным стало решение с OS.execute(...), который умеет запускать проекты и даже схватывать вывод программ.
Такое решение не подходит, ибо процессы, запускаемые при помощи NW асинхронны и ловить их выхлоп Godot не умеет.

Решение.
На выбор было три языка: C++, Pascal и NW.js. 
Почему не NW.js: собранная программа на NW имеет охренительный вес. Соответственно, когда редактор весит 15мб, вешать к нему утилитку для управления процессами весом в ~50мб как-то не хочется.

Почему не C++: тут диапазон выбора намного больше, как в плане GUI так и в плане реализации. Однако требуется кроссплатформенное решение, поэтому тут взгляд сразу падает на "Qt vs wxWidget". Я выбрал Qt и попробовал накалякать приложение с GUI и возможностью управлять процессом и упёрся в документацию по QProcess. В итоге реализовал программку, которая, в принципе, решала эту задачу. Однако, с разной степенью периодичности оболочка зависала с утечкой. Знаю, что мой косяк, но я решил отложить это на время и заглянуть еще в Pascal. 

Почему Lazarus: сперва я просто сделал некую оболочку, запускающую любой процесс (для отлова вывода), предназначенный для консольного режима. Перехватить вывод процесса оказалось в разы проще, чем в Qt, поскольку тут уже есть асинхронные компоненты для работы. После этого полученный вывод программа просто записывает в файл, откуда внешние приложения могут спокойно его читать. Ради интереса я собрал программу на Qt и на Lazarus под Windows, зашел под ней и попробовал. С Qt песня повторилась - процесс после пары минут работы повис намертво. Хотя дочерний процесс (вывод с которого выхватывался) продолжал работать вполне корректно. 100% мой косяк, поскольку я что-то не учел. Однако проект, собранный в Lazarus исправно работал и под Windows. После этого я добавил туда возможность манипулировать дочерним процессом, убрал внешнюю форму (окно), чтобы не мешала и сделал дополнительно интерфейс взаимодействия программы через самопальный "менеджер состояний", работает который через специальные файловые "рычажки". Дополнительно так же завел второй поток, чтобы разгрузить стэк. Второй поток как раз-таки мониторит состояние "рычажков" и делает те или иные действия с дочерним процессом. Получилось очень удобно.

Результат: теперь, положив эту утилитку рядом с собранным в Godot проектом, можно из Godot запускать внешние процессы, читать их вывод и управлять ими. Прослойкой как раз выступает эта утилитка.

Бонус: утилитка кроссплатформенная и с ней может работать любая программа или библиотека. Более того, извращенцы могут юзать её и вручную.

Поведение: утилита запускает дочерний процесс и мониторит его. Если дочерний процесс был завершен, утилитка тоже завершает свою работу.

Запускать дочерние процессы крайне просто:
в Linux: $ nw_starter /path/to/nw /path/to/project/
в Windows: nw_starter.exe C:/path/to/nw.exe C:/path/to/project

Пути можно указывать и абсолютные. Программа смотрит относительно себя.

В итоге у меня получился редактор проектов NW.js. который весит всего 12Мб. 
 

Категория: Skaner & YouTube | Просмотров: 52 | Добавил: skanersoft | Рейтинг: 0.0/0
Всего комментариев: 0
avatar