Какой язык сценариев подходит для интеграции в высокопроизводительные приложения?

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

Ключевые особенности желаемой системы сценариев (в порядке важности):

  • Производительность - НЕОБХОДИМО быстро вызывать и обновлять скрипты
  • Кросс-платформенный - должен быть относительно простым для переноса на несколько платформ (не возражайте против небольшой работы, но для переноса на каждую платформу потребуется всего несколько дней)
  • Автономная компиляция - возможность предварительного синтаксического анализа кода скрипта в автономном режиме практически необходима (помогает с размерами файлов и временем загрузки)
  • Способность хорошо интегрироваться с c ++ - должна иметь возможность поддерживать объектно-ориентированный код на языке и интегрировать эту функциональность с c ++.
  • Многопоточность - не обязательно, но желательно. Было бы лучше иметь возможность запускать отдельные экземпляры его в нескольких потоках, которые не мешают друг другу (т.е. нет глобальных объектов в базовом коде, которые необходимо изменять во время работы). Решения на основе критических разделов и мьютексов не требуются.

До сих пор у меня был опыт интеграции / использования Lua, Squirrel (язык OO, основанный на Lua), и я написал виртуальную машину ActionScript 2.

Итак, какую систему сценариев вы порекомендуете, которая соответствует указанным выше критериям? (И, если возможно, не могли бы вы также опубликовать или связать какие-либо сравнения с другими языками сценариев, которые у вас могут быть)

Спасибо, Грант

Ответов (10)

Решение

Пока что с Squirrel нам везет . Lua настолько популярен, что становится стандартом.

Я рекомендую вам больше беспокоиться о памяти, чем о скорости. Большинство языков сценариев «достаточно быстры», и если они становятся медленными, вы всегда можете вернуть часть этих функций обратно в C++. Однако многие из них прожигают много памяти, а память консоли является даже более дефицитным ресурсом, чем время процессора. Неограниченное потребление памяти в конечном итоге приведет к сбою, и если вам нужно выделить 4 МБ только для интерпретатора, это все равно, что выбросить 30 текстур в окно, чтобы освободить место.

Lua уже много лет используется в индустрии видеоигр. Легкий и эффективный.

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

Преимущество Lua в том, что он проверен временем рядом известных разработчиков видеоигр и имеет хорошую базу знающих разработчиков благодаря тому, что Blizzard-Activision приняли его в качестве основной платформы для разработки надстроек World of Warcraft.

Начните с Python .

Если вы можете доказать, что вам нужно больше скорости, посмотрите на Stackless Python . Это то, что EVE Online использует в своей игре.

На ум приходят:

  • Lua
  • Python с boost :: python
  • MzScheme или Коварство
  • Рубин с SWIG

Lua очень хорошо подходит для ваших нужд. Я возьму их в таком же порядке.

Lua - один из самых быстрых языков сценариев. Это быстро компилируется и быстро запускается.

Lua компилируется на любой платформе с помощью компилятора ANSI C, который afaik включает все игровые платформы.

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

Существует множество инструментов привязки Lua / C++.

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

Lua , а затем LuaJIT для дополнительной легкости!

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

что касается параллелизма, либо LuaLanes , либо накатывай свой. если ваша программа на C++ уже является многопоточной, просто вызовите отдельные LuaStates из каждого потока и при необходимости используйте свои собственные общие структуры C++ в качестве каналов связи.

как вы, возможно, уже знаете, наиболее часто повторяемый ответ в Lua - это «сделай сам», и часто это лучший совет! кроме случаев, когда речь идет о привязках к обычным библиотекам C/C++, в этом случае вполне вероятно, что она уже существует.

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

Если вы еще не смотрели его, я бы посоветовал вам проверить Angelscript .

Я успешно использовал его в кроссплатформенной среде (Windows и Linux только с перекомпиляцией), и он разработан для хорошей интеграции с C++ (как объекты, так и код).

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