Подтвердить что ты не робот

Реализация скриптов в приложении С++

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

Поскольку это приложение в реальном времени, мне нужно иметь какую-то многозадачность для этих скриптов. В идеале я хочу, чтобы приложение С++ вызывало функцию script, которая затем продолжает работать (под потоком С++) до тех пор, пока не появится точка паузы (Wait (x)) или она не вернется. В случае его ожидания состояние должно быть сохранено в готовности к перезапуску script при следующем запуске приложения после истечения продолжительности.

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

Я не хочу тратить огромное количество времени на реализацию этого, поэтому использование существующего языка сценариев предпочтительнее писать мои собственные. Я слышал, что Python и Lua могут быть интегрированы в приложение С++, но я не знаю, как это сделать для достижения моих целей.

  • Сценарии должны иметь возможность вызывать функции С++
  • Сценарии должны иметь возможность "приостанавливать", когда вызываются определенные функции (например, "Ожидание" ), и снова запускаться с помощью потока С++
  • Нужно быть быстрым - это приложение для реального времени, и потенциально может быть много запущенных скриптов.

Я могу, вероятно, свернуть многозадачный код довольно легко, при условии, что скрипты можно сохранить и перезапустить (возможно, с помощью другого потока к оригиналу).

4b9b3361

Ответ 1

Вы можете использовать Lua или Python. Lua более "легкий", чем питон. Он получил меньший объем памяти, чем у python, и в нашем опыте было легче интегрироваться (пробег людей по этому вопросу может меняться). Он может поддерживать кучу скриптов, работающих одновременно. Lua, по крайней мере, поддерживает остановку/запуск потоков так, как вы пожелаете.

Boost.python хорош, но в моем (ограниченном) опыте нам было сложно собраться для разных условий и был довольно тяжеловесным. Это (на мой взгляд) недостаток, требующий Boost. Для некоторых это может быть не проблема, но если вам не нужен Boost (или не используется), вы вводите тонну кода, чтобы заставить Boost.python работать. YMMV.

Мы создали Lua в приложениях на нескольких платформах (win32, Xbox360 и PS3). Я считаю, что он будет работать на x64. Предложение использовать Luabind хорошо. Мы закончили писать собственный интерфейс между ними и не слишком сложны, поскольку этот код будет экономить много времени и, возможно, обострение.

При любом решении, отладка может быть болью. В настоящее время у нас нет хорошего решения для отладки сценариев Lua, встроенных в наше приложение. Поскольку мы не использовали python в наших приложениях, я не могу говорить о том, какие инструменты могут быть доступны там, но пару лет назад пейзаж был примерно одинаковым - плохая отладка. Наличие сценариев для расширения функциональности является приятным, но ошибки в сценариях могут вызвать проблемы и могут быть трудно найти.

Сам код Lua очень грязный, чтобы работать, если вам нужно внести туда изменения. Мы видели ошибки в самой кодовой базе Lua, которые трудно отследить. Я подозреваю, что Boost:: Python может иметь схожие проблемы.

И с любым языком сценариев это не обязательно решение для "не-программистов" для расширения функциональности. Это может показаться, но вы, скорее всего, потратите немало времени на отладку сценариев или даже на Lua.

Что все сказали, мы очень довольны Lua и отправили его в две игры. В настоящее время мы не планируем отойти от языка. В целом, мы нашли это лучше, чем другие альтернативы, которые были доступны пару лет назад. Python (и IronPython) - это другие варианты, но на основе опыта они кажутся более тяжелыми, чем Lua. Мне бы хотелось услышать о других впечатлениях там, хотя.

Ответ 2

Я очень рекомендую вам взглянуть на Luabind. Это очень просто для интеграции Lua в ваш код на С++ и наоборот. Также возможно выставить все классы С++, которые будут использоваться в Lua.

Ответ 3

Лучше всего вставить либо lua (www.lua.org), либо python (www.python.org). Оба они используются в игровой индустрии, и оба доступа к внешним функциям "C" относительно легко, поскольку lua имеет преимущество здесь (поскольку типы данных легче перевести между lua и C). Взаимодействие с объектами С++ будет немного больше работать с вашей стороны, но вы можете посмотреть, как это сделать в Google, или на форумах обсуждения lua или python.

Я надеюсь, что это поможет!

Ответ 4

Вы можете определенно сделать то, что хотите, с Python. Вот документы по встраиванию Python в приложение. Я уверен, что Lua тоже будет работать, я просто менее знаком с ним.

Вы описываете совместную многозадачность, где script необходимо периодически вызывать функцию Break или Wait. Возможно, лучшим решением было бы запустить скриптовый язык в своем потоке, а затем использовать мьютексы или блокировки для интерфейсов между языком сценариев и остальной частью вашей программы. Таким образом, багги script, которые не называют Break() достаточно часто, не могут случайно заблокировать вашу программу.

Ответ 5

Взгляните на библиотеку Boost.Python. Похоже, должно быть довольно просто сделать то, что вы хотите.

Ответ 6

Взгляните на SWIG. Я использовал его для взаимодействия с Python, но он поддерживает многие другие языки.

Ответ 7

Еще один голос за Луа. Он маленький, он быстрый, он не потребляет много памяти (для игр лучше всего выделять большой буфер при инициализации и перенаправлять все распределения памяти Lua там). Мы использовали tolua для создания привязок, но есть и другие варианты, большинство из которых намного меньше/проще в использовании (IMO), чем boost.python.

Ответ 8

Что касается отладки Lua (если вы идете по этому маршруту), я использую DeCoda, и это не так уж плохо. Он претендует на IDE, но sorta терпит неудачу, но вы можете присоединить процесс отладки к визуальной студии и спуститься в стек вызовов в точках разрыва. Очень удобно для отслеживания этой ошибки.

Ответ 9

Вы также можете вставлять скрипты C/С++ с помощью Ch. Я использую его для игрового проекта, над которым я работаю, и все хорошо. Хорошее сочетание мощности и приспособляемости.