RU

Портирование QSP на Javascript

Nex Moderator 07.05.2016 14:49 18 comments 12856 views

Набрёл сегодня на интересную статью про Emscripten.

Emscripten - это утилита, которая переводит C и C++ код в Javascript.

https://developer.mozilla.org/ru/docs/Mozilla/Projects/Emscripten

https://developer.mozilla.org/en-US/docs/Games/Tools/asm.js

Почитав, снова воодушевился идеей портировать движок QSP на “чистый” яваскрипт.

Насколько я помню, раньше попытку портирования на яваскрипт предпринимал Ntropy. Что-то у него даже заработало, но слишком сильно тормозило.

Учитывая, что яваскрипт в современных браузерах исполняется быстрее, чем в те времена, а также направленность Emscripten на оптимизацию генерируемого кода, считаю, было бы неплохо ещё раз попробовать.

Может, в этот раз скорость будет приемлемая.
Какие плюсы это может дать:

1. Онлайн-плеер для проигрывания в браузере.

Можно будет написать онлайн-плеер без использования Flash. Это очень сильно упрощает задачу написания онлайн-плеера. Также это даёт доступ гораздо большему количеству пользователей, которые по разным причинам не пользуются Flash.

2. Плеер гораздо проще будет портировать на любые платформы.

Например, iOS, MacOS, Linux, Windows Phone.

Будет единое ядро, которое не нужно переписывать под каждую платформу. Даже в Навигаторе, например, под каждую платформу приходится писать код, который служит “переходником” между браузерным движком и библиотекой QSP.

Портировав библиотеку на яваскрипт целиком, мы получим универсальный код, и “переходники” писать уже не потребуется.

3. Станут доступны для использования платформы, которые не поддерживают связку нативного кода с браузерным движком.

Хотя все самые популярные платформы не имеют проблем с использованием нативного кода, но потенциальная возможность “засунуть этот плеер куда-нибудь ещё” - по-моему, здорово.

4. Улучшение производительности?

Одна из проблем Навигатора, это низкая производительность “моста” между нативным кодом и яваскриптом. Пришлось даже пойти на всякие ухищрения, чтобы добиться примелемой скорости и качества работы плеера.

Избавившись от необходимости исползовать “мост”, мы, возможно, выиграем по производительности. Но это ещё под вопросом, учитывая, что яваскриптовый код библиотеки будет исполняться медленнее нативного.

Отлично, что ты этим занялся, это очень нужное и важное дело!
На самом деле, я предпринимал попытку немного побаловаться с emscripten, правда, на примере Инстеда. К сожалению, пока ничего не вышло из-за того, что Инстед использует много разных внешних библиотек, с компиляцией которых я пока не справился. QSP в этом отношении мне кажется лучше в том смысле, что, насколько я понимаю, сишный код QSP самодостаточен и не зависит от внещних библиотек. В случае с QSP меня остановило отсутствие make-файла и нехватка времени на то, чтобы сделать его самому (насколько я понимаю, можно переделать вот этот вот файл для Андроид-сборки: https://github.com/Nex-Otaku/quest-navigator-library-android/blob/master/jni/Android.mk), плюс потом потребуется как-то это совместить с QN.
Сообщай о достигнутых результатах, пожалуйста, и удачи!

Отличная идея, может кто и решиться подсобить в этом не лёгком деле.

Antokolos,
в QSP используется библиотека регулярных выражений. Так что внешняя зависимость всё-таки есть.
Но на первое время можно и без неё сделать плеер, всё равно эта возможность явно излишняя.

Сам я пока этим заниматься не планирую. Много других дел )

Но если никто не возьмётся, и будет подходящее настроение… Может, и попробую. Посмотрим.

В любом случае, буду рад, если кто-то этим займётся раньше меня.

Antokolos,
кстати про Инстед, движок Lua уже портировал на яваскрипт сам автор Emscripten.

http://mozakai.blogspot.ru/2013/05/lua-in-javascript-running-vm-in-vm.html

https://kripken.github.io/lua.vm.js/lua.vm.js.html

Попытался побаловаться с Emscripten и QSP.
Код библиотеки QSP взял отсюда
https://github.com/Nex-Otaku/quest-navigator-library-android/tree/master/jni
Немножко подправил, т.к. были ошибки компиляции. Возможно, подправил некорректно.
Сделал makefile. Просьба не пинать, это мой первый опыт в их создании, выглядит, наверно, страшно :)
при запуске build.sh компилируется код qsp в LLVM-байткод, потом из него делается qsp.js
но, похоже, самих функций qsp внутри нет, только C-библитека и что-то ещё.
Вот тут есть документация, как подключить скомпилированные функции. У меня пока это сделать не получилось.
В аттаче код, с которым я экспериментировал, вдруг пригодится.
qsp.zip

Получилось собрать! Мне оставался только один шажок :)
Правда, после компиляции какие-то странные предупреждения выдаются,
warning: unresolved symbol: qspCurMenuItems
warning: unresolved symbol: qspCurMenuLocs

но в cгенерированном JS-файле QSP-функции есть. Как их вызывать, см. здесь

В аттаче: результат компиляции без оптимизации и с флагами -O2 -O3, а также то, из чего собирал. Могу залить куда-нибудь на ГитХаб. Видимо, это будет новый проект quest-navigator-online или что-то типа того
quest-navigator-em.zip
20052016-2155_qsp.zip
20052016-2156_qsp.zip
20052016-2156_20052016-2156_qsp.zip

Antokolos,
идеально будет, если ты выложишь инструкцию по сборке, чтобы можно было повторить весь процесс.

Nex, ага, завтра постараюсь сделать.
В принципе, для сборки надо установить emscripten и выполнить команды из файла build.sh
Завтра доработаю make-файл, чтобы файл build.sh был вообще не нужен.
По поводу доработок кода QSP, проще всего залить в Git сначала исходную версию, а потом мои фиксы. Я только правил то, что вызывало ошибки компиляции. К примеру, была какая-то проблема с вызовом функции time, какие-то undeclared identifier и что-то ещё.
Ещё вопрос по поводу версии библиотеки: чем отличаются вот эти две:
https://github.com/QSPFoundation/qsp/tree/master/qsp
https://github.com/Nex-Otaku/quest-navigator-library-android/tree/master/jni/qsp

Antokolos,
Первая - официальный репозиторий библиотеки, над ним работает Байт.
Вторая - репозиторий “замороженной” версии библиотеки, специально для Навигатора.

Ещё одно отличие - в “Навигаторской” библиотеке введена новая функция запросов к плееру GETPLAYER, по которой он возвращает полезную для игры информацию. См. “Функция запросов к плееру”.

Потыкал модуль, похоже он действительно работает.

Но для реального использования ещё предстоит работа по обвязке всех функций в удобную обёртку, чтобы не приходилось обращаться через API Emscripten.

Плюс к этому, нужно решить вопросы с колбэками, запуском музыки, загрузкой файлов, переводом строк из формата QSP в обычные строки яваскрипта.

Пример:
Module.cwrap(’QSPGetVersion’, ‘string’, [])();
Этот вызов должен вернуть строку “5.7.0”.
Возвращает “5”, потому что за байтом “5” идёт нулевой байт, такой формат у строк QSP.

Их надо преобразовывать, и, по-хорошему, стоит делать преобразование на уровне компилируемого модуля, чтобы было побыстрее.

Спасибо за помощь в компиляции!

Ура, здорово!
Хорошо, что заработало.
Выложил улучшенный код вот сюда:
https://github.com/Antokolos/quest-navigator-web
Самого Квест-Навигатора там пока нет, только сишный код библиотеки из предыдущего архива. Зато можно посмотреть по истории на изменения в нём.
Для сборки, как уже писал, достаточно поставить Emscripten и выполнить в папке проекта команду emmake make. Теперь я внёс всё необходимое для сборки в сам make-файл, дополнительных скриптов не требуется.

Antokolos,
открой, пожалуйста, доступ на запись в реп.

Мой аккаунт - nex@otaku.ru.

Попробовал, собирается )
Для винды ещё потребовалось GnuWin32/Make скачать.

Говорит, что
nex@otaku.ru doesn’t have a GitHub account
Добавил по имени пользователя Nex-Otaku, вроде добавилось.

Да, работает :)

Спасибо.

Попробовал продолжить объединение с QN.
Закоммитил JS-файлы QN, html-страничку.
Попытался написать бридж, угадывая смысл функций по их названию :) Всё же не хватает мне знаний внутренностей QSP
Вот этот бридж:
https://github.com/Antokolos/quest-navigator-web/blob/master/js/QspLibEM.js
Пока что это совершенно точно не заработает, я даже не знаю, можно ли писать ‘boolean’, если возвращается QSP_BOOL.
Плюс кое-где я не осознал, какую QSP-функцию сопоставить.
Я попробую ещё разобраться с кодом QN, но пока что-то прогресс и масштаб работ непонятен.
Конечный результат, которого хочется достичь: чтобы при открытии файла gameEM_default.html в браузере открывался интерфейс Навигатора и можно было бы сыграть в какую-нибудь тестовую игрушку.

Log in or Register to post comments.