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





Взгляните на библиотеку Boost.Python. Похоже, что делать то, что вы хотите, должно быть довольно просто.
Я очень рекомендую вам взглянуть на Luabind. Это позволяет очень просто интегрировать Lua в ваш код C++ и наоборот. Также возможно предоставить целые классы C++ для использования в Lua.
Вы определенно можете делать с Python все, что хотите. Вот документы по встраиванию Python в приложение. Я почти уверен, что Lua тоже будет работать, просто я менее знаком с ним.
Вы описываете совместную многозадачность, когда скрипту необходимо периодически вызывать функцию Break или Wait. Возможно, лучшим решением было бы запустить язык сценариев в отдельном потоке, а затем использовать мьютексы или очереди без блокировки для интерфейсов между языком сценариев и остальной частью вашей программы. Таким образом, скрипт с ошибками, который не вызывает Break () достаточно часто, не может случайно заморозить вашу программу.
Лучше всего встроить либо lua (www.lua.org), либо python (www.python.org). Оба используются в игровой индустрии, и оба относительно легко обращаются к функциям extern "C", причем lua имеет здесь преимущество (поскольку типы данных легче переводить между lua и C). Взаимодействие с объектами C++ потребует от вас немного большей работы, но вы можете узнать, как это сделать, в Google или на дискуссионных форумах lua или python.
Надеюсь, это поможет!
Я не использовал ни то, ни другое в многопоточной среде. Возможно, вы захотите опубликовать этот вопрос на форумах, посвященных lua и python.
@FireLancer: Скорее всего, это будет на два года позже, когда вам пригодится '08, но с тех пор, как ответить на ваш вопрос для всех, кто мог бы прочитать это сегодня: Lua использует сопрограммы, чтобы делать то, что вы описываете. Вы можете вызвать yield (), чтобы приостановить сопрограмму, и resume (), чтобы продолжить с того места, где вы остановились. Вы можете передать в yield () параметры, которые возвращаются из предыдущего resume (), и передать параметры в resume (), которые передаются соответствующему yield (), который возобновляет работу.
Вы также можете встраивать скрипты C / C++, используя Ch. Я использую его для игрового проекта, над которым работаю, и он хорошо работает. Прекрасное сочетание мощности и адаптируемости.
Вы можете использовать Lua или Python. Lua более «легкий», чем python. У него меньше памяти, чем у 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. Я бы хотел услышать там о других впечатлениях.
Как именно Lua работает с вашими играми? например, выполняется ли каждый сценарий все время в своем собственном потоке до завершения, обрабатывается ли каждый сценарий как функция (т.е. выполняется в вызывающем потоке до тех пор, пока он не вернется) или как его собственная мини-программа (как я описал выше)?
Сценарии Lua могут выполняться в «потоках» и не обязательно должны обрабатываться встроенными функциями, как функции. Он будет делать то, что вы хотите.
Ok. Затем я рассмотрю его более подробно и напишу несколько тестов, чтобы выяснить, как именно я хочу интегрировать его с моей базой кода :)
Взгляните на SWIG. Я использовал его для взаимодействия с Python, но он поддерживает многие другие языки.
Еще один голос за Lua. Он маленький, быстрый и не потребляет много памяти (для игр лучше всего выделить большой буфер при инициализации и перенаправить туда все выделения памяти Lua). Мы использовали tolua для создания привязок, но есть и другие варианты, большинство из которых намного меньше / проще в использовании (IMO), чем boost.python.
Что касается отладки Lua (если вы пойдете по этому пути), я использовал DeCoda, и это было неплохо. Он выдает себя за IDE, но с этим не справляется, но вы можете присоединить процесс отладки к Visual Studio и перейти вниз по стеку вызовов в точках останова. Очень удобно для отслеживания этой ошибки.
Хорошо, они оба кажутся хорошими, но поддерживают ли они паузу / перезапуск и способ, которым я хочу, чтобы они работали с потоками (например, используя поток, который вызывал скрипт, пока он не вернется или не остановится)