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

StackOverflow https://stackoverflow.com/questions/63784

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

Взгляните на ГЛОТОК.Я использовал его для взаимодействия с Python, но он поддерживает множество других языков.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top