Свой скриптовый движок с шахматами и поэтессами. — Программирование

Как мы все знаем, во всех lua скриптовых движках для XPlane имеется фатальный недостаток: референсная имплементация lua медленная, потому все используют luajit, который имеет серьезную проблему с выделением памяти на 64-х битных системах и будущее его весьма сомнительно (за 3 года толком ничего не добавили, а версии 3, похоже, нету даже в проекте).

 

В итоге я написал just for fun свой велосипед, использующий JavaScript.

 

Почему JS?

0. Модно, стильно, молодёжно.

1. Широко используемый, развивающийся язык.

2. Много постоянно развивающихся интерпретаторов (v8, SpiderMonkey)

3. Возможность тестировать свои наработки как в бразузере, так и прямо онлайен на том же jsfiddle.

4*. Отладчик (хотя для lua тоже есть отладчики, но тем не менее я его таки прикрутил :)

 

Вдруг кому-то надо:

https://github.com/invy/xpjs

 

TODO: собрать и протестировать под виндой/маком, дописать фичи (потому что пока только запись/чтение датарефов), починить баги

Пример скрипта:

xplog('plugin started at: ' +new Date())
 
// data ref definition
var axisValues = requestDRef('sim/joystick/joystick_axis_values');
var hstabElev = requestDRef('sim/flightmodel2/wing/elevator1_deg');
var ail1 = requestDRef('sim/flightmodel2/wing/aileron1_deg');
var overrideSurfaces = requestDRef('sim/operation/override/override_control_surfaces');
 
set(overrideSurfaces, 1);

function update() {
 var pitch = getAt(axisValues, 1);
 var roll = getAt(axisValues, 0);
 setAt(hstabElev, 8, -(pitch-0.5)*30);
 setAt(hstabElev, 9,-(pitch-0.5)*30);
 setAt(ail1, 0, (roll-0.5)*30);
 setAt(ail1, 1, -(roll-0.5)*30);
}

Более крупный пример (fbw а-ля airbus): https://github.com/i…fbw/avionics.js

 

На картинке справа — отладчик/консоль (jrdb из проекта jsrdb). Можно как выполнять скрипт пошагово, так и вызывать различные функции, что иногда бывает удобным.

xpjs_example.png

Сообщение отредактировано inv: 06 January 2016 — 14:29

Ответов: 75

Как мы все знаем, во всех lua скриптовых движках для XPlane имеется фатальный недостаток: референсная имплементация lua медленная, потому все используют luajit, который имеет серьезную проблему с выделением памяти на 64-х битных системах и будущее его весьма сомнительно (за 3 года толком ничего не добавили, а версии 3, похоже, нету даже в проекте).

 

В итоге я написал just for fun свой велосипед, использующий JavaScript.

 

Почему JS?

0. Модно, стильно, молодёжно.

1. Широко используемый, развивающийся язык.

2. Много постоянно развивающихся интерпретаторов (v8, SpiderMonkey)

3. Возможность тестировать свои наработки как в бразузере, так и прямо онлайен на том же jsfiddle.

4*. Отладчик (хотя для lua тоже есть отладчики, но тем не менее я его таки прикрутил :)

 

Вдруг кому-то надо:

https://github.com/invy/xpjs

 

TODO: собрать и протестировать под виндой/маком, дописать фичи (потому что пока только запись/чтение датарефов), починить баги

Пример скрипта:

xplog('plugin started at: ' +new Date())
 
// data ref definition
var axisValues = requestDRef('sim/joystick/joystick_axis_values');
var hstabElev = requestDRef('sim/flightmodel2/wing/elevator1_deg');
var ail1 = requestDRef('sim/flightmodel2/wing/aileron1_deg');
var overrideSurfaces = requestDRef('sim/operation/override/override_control_surfaces');
 
set(overrideSurfaces, 1);

function update() {
 var pitch = getAt(axisValues, 1);
 var roll = getAt(axisValues, 0);
 setAt(hstabElev, 8, -(pitch-0.5)*30);
 setAt(hstabElev, 9,-(pitch-0.5)*30);
 setAt(ail1, 0, (roll-0.5)*30);
 setAt(ail1, 1, -(roll-0.5)*30);
}

Более крупный пример (fbw а-ля airbus): https://github.com/i…fbw/avionics.js

 

На картинке справа — отладчик/консоль (jrdb из проекта jsrdb). Можно как выполнять скрипт пошагово, так и вызывать различные функции, что иногда бывает удобным.

xpjs_example.png

Сообщение отредактировано inv: 06 January 2016 — 14:29

Клево-клево. А можно в двух словах про проблему с памятью luajit x64?

Клево-клево. А можно в двух словах про проблему с памятью luajit x64?

Клево-клево. А можно в двух словах про проблему с памятью luajit x64?

Одним словом — там дикие костыли.

В двух словах: luajit может выделять память только в первых двух гигабайтах аддресного пространства (почему так написан — не ясно), что приводило к проблемам (Когда XPlane загрузит сценариев и объектов, в первых двуг гигабайтах места совсем не остается).

Разработчики XPlane и lua-плагинов придумали костыль: XPlane при загрузке резервирует место в первых двух гигабайтах, и выделяет плагинам, использующим lua по их требованию.

Но это еще не всё. По какой-то причине разработчики luajit решили убрать из API возможность указывать luajit’у allocator, в итоге для работы вышеописанных костылей нужна еще и патченая версия luajit’a.

 

Подробнее тут: http://hacksoflife.b…ane-64-bit.html

 

Ну и да, у меня почему-то ВСЕ версии sasl’а (само-собранная, проприетарная, те, которые были раньше),  вешают XPlane намертво, почему — не ясно и ковыряться как-то не сильно хотелось, интереснее было написать велосипед.

Сообщение отредактировано inv: 05 January 2016 — 17:41

Клево-клево. А можно в двух словах про проблему с памятью luajit x64?

Одним словом — там дикие костыли.

В двух словах: luajit может выделять память только в первых двух гигабайтах аддресного пространства (почему так написан — не ясно), что приводило к проблемам (Когда XPlane загрузит сценариев и объектов, в первых двуг гигабайтах места совсем не остается).

Разработчики XPlane и lua-плагинов придумали костыль: XPlane при загрузке резервирует место в первых двух гигабайтах, и выделяет плагинам, использующим lua по их требованию.

Но это еще не всё. По какой-то причине разработчики luajit решили убрать из API возможность указывать luajit’у allocator, в итоге для работы вышеописанных костылей нужна еще и патченая версия luajit’a.

 

Подробнее тут: http://hacksoflife.b…ane-64-bit.html

 

Ну и да, у меня почему-то ВСЕ версии sasl’а (само-собранная, проприетарная, те, которые были раньше),  вешают XPlane намертво, почему — не ясно и ковыряться как-то не сильно хотелось, интереснее было написать велосипед.

Сообщение отредактировано inv: 05 January 2016 — 17:41

Да уж, дичь еще та. А оригинальный луа сильно медленней джита?

Да уж, дичь еще та. А оригинальный луа сильно медленней джита?

Да уж, дичь еще та. А оригинальный луа сильно медленней джита?

Судя по тестам с luajit’а довольно большая разница: http://luajit.org/performance_x86.html

Да уж, дичь еще та. А оригинальный луа сильно медленней джита?

Судя по тестам с luajit’а довольно большая разница: http://luajit.org/performance_x86.html

Больше скриптов хороших и разных! :pioneer:

Как мы все знаем, во всех lua скриптовых движках для XPlane имеется фатальный недостаток: референсная имплементация lua медленная

Слова lua и X-Plane в этом предложении лишние ;) Интерпретатор, даже с байт-кодом, переубедить таки сложно :sarcastic:, что тесты по приведенной ссылке хорошо иллюстрируют

Больше скриптов хороших и разных! :pioneer:

Как мы все знаем, во всех lua скриптовых движках для XPlane имеется фатальный недостаток: референсная имплементация lua медленная

Слова lua и X-Plane в этом предложении лишние ;) Интерпретатор, даже с байт-кодом, переубедить таки сложно :sarcastic:, что тесты по приведенной ссылке хорошо иллюстрируют

Больше скриптов хороших и разных! :pioneer:
Слова lua и X-Plane в этом предложении лишние ;) Интерпретатор, даже с байт-кодом, переубедить таки сложно :sarcastic:, что тесты по приведенной ссылке хорошо иллюстрируют

В общем, да, для серьезных моделей оно всё не очень подходит, но для мелочей и экспериментов скрипты удобны.

Больше скриптов хороших и разных! :pioneer:
Слова lua и X-Plane в этом предложении лишние ;) Интерпретатор, даже с байт-кодом, переубедить таки сложно :sarcastic:, что тесты по приведенной ссылке хорошо иллюстрируют

В общем, да, для серьезных моделей оно всё не очень подходит, но для мелочей и экспериментов скрипты удобны.

В общем, да, для серьезных моделей оно всё не очень подходит, но для мелочей и экспериментов скрипты удобны.

Как средство прототипирования — почти идеально. Вот хоть С скриптовый запихивай, чтобы потом не переписывать заново ;)

В общем, да, для серьезных моделей оно всё не очень подходит, но для мелочей и экспериментов скрипты удобны.

Как средство прототипирования — почти идеально. Вот хоть С скриптовый запихивай, чтобы потом не переписывать заново ;)

Добавил пример: fbw а-ля airbus. (Пока автотрим без протекшнов)

https://github.com/i…fbw/avionics.js

 

Тестировал на модельке dc9-30 (бесплатная с орга), летает как по рэльсам.

Добавил пример: fbw а-ля airbus. (Пока автотрим без протекшнов)

https://github.com/i…fbw/avionics.js

 

Тестировал на модельке dc9-30 (бесплатная с орга), летает как по рэльсам.

Добавил пример: fbw а-ля airbus. (Пока автотрим без протекшнов)

Интеграл бы только ограничить, на всякий случАй. Имеет свойство иногда феерично гадить :yes:

Добавил пример: fbw а-ля airbus. (Пока автотрим без протекшнов)

Интеграл бы только ограничить, на всякий случАй. Имеет свойство иногда феерично гадить :yes:

Интеграл бы только ограничить, на всякий случАй. Имеет свойство иногда феерично гадить :yes:

По хорошему, сначала надо настроить адекватную скорость отклонения плоскостей, а потом уже настраивать регуляторы и всё остальное :)

 

Но совет учту :)

Сообщение отредактировано inv: 06 January 2016 — 15:34

Интеграл бы только ограничить, на всякий случАй. Имеет свойство иногда феерично гадить :yes:

По хорошему, сначала надо настроить адекватную скорость отклонения плоскостей, а потом уже настраивать регуляторы и всё остальное :)

 

Но совет учту :)

Сообщение отредактировано inv: 06 January 2016 — 15:34

По хорошему, сначала надо настроить адекватную скорость отклонения плоскостей, а потом уже настраивать регуляторы и всё остальное :)

А эта бяка может как раз таки мешать настройке. В реальности, если уж используется именно PID, то интеграл(не коэффициент при ∫ !) цЫнично ограничивается в росте.

Сообщение отредактировано Ghost-V: 06 January 2016 — 15:35

По хорошему, сначала надо настроить адекватную скорость отклонения плоскостей, а потом уже настраивать регуляторы и всё остальное :)

А эта бяка может как раз таки мешать настройке. В реальности, если уж используется именно PID, то интеграл(не коэффициент при ∫ !) цЫнично ограничивается в росте.

Сообщение отредактировано Ghost-V: 06 January 2016 — 15:35

А эта бяка может как раз таки мешать настройке. В реальности, если уж используется именно PID, то интеграл(не коэффициент при ∫ !) цЫнично ограничивается в росте.

Речь об integral windup, я правильно понимаю?

А эта бяка может как раз таки мешать настройке. В реальности, если уж используется именно PID, то интеграл(не коэффициент при ∫ !) цЫнично ограничивается в росте.

Речь об integral windup, я правильно понимаю?