Реализация скриптов в приложении c ++ - PullRequest
25 голосов
/ 15 сентября 2008

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

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

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

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

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

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

Ответы [ 9 ]

25 голосов
/ 15 сентября 2008

Вы можете использовать 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.

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

9 голосов
/ 15 сентября 2008

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

5 голосов
/ 15 сентября 2008

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

Надеюсь, это поможет!

3 голосов
/ 15 сентября 2008

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

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

2 голосов
/ 20 декабря 2008

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

2 голосов
/ 15 сентября 2008

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

2 голосов
/ 15 сентября 2008

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

2 голосов
/ 15 сентября 2008

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

1 голос
/ 15 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...