Будет ли использование сценариев Lua для определения игровой логики для сервера MMO намного медленнее, чем скомпилированное в C ++?


10

Я использую систему сущностей для своего MMO-сервера, и я думал об определении поведения «действий» с помощью сценариев Lua. Сервер написан на C ++. Я не очень знаком со скоростью / памятью, используемой Lua в C ++, но я использовал ее для написания сценариев GUI клиента. Будет ли использование Lua для определения игровой логики на стороне сервера значительно снизить производительность?


Ответы:


20

TL; DR: Lua имеет накладные расходы, но при правильном использовании он незначителен и легко смягчается. Не используйте его для тяжелых математических операций или преобразования геометрии. Вы, вероятно, не увидите никаких проблем с производительностью, если будете использовать его для создания сценариев графического интерфейса.

Я сделал несколько базовых тестов производительности Lua как языка сценариев игры, и он чертовски быстр. Используя tolua ++ для привязки LuaJIT к моему игровому движку, я породил 2000 актеров, каждый из которых контролировался сценарием Lua, называемым каждым игровым циклом (с аргументом дельта-времени). У половины актеров был сценарий флокирования, а другая половина выполняла своего рода случайную прогулку (и стая их избегали).

Отключение компонента рендеринга дало мне чуть более 400 тиков в секунду на моем Opteron 170 (2x2,0 ГГц, хотя в то время мой двигатель был однопоточным). Я полагаю, что я мог бы выжать немного больше, чем это, если бы я копался и оптимизировал, возможно перенеся часть тяжелой работы обратно в C ++. Обновление 2000 актеров 400 раз в секунду было довольно впечатляющим и намного превзошло мои ожидания в то время.

Сейчас я использую Lua во всех своих проектах, и он на самом деле составляет довольно большую часть реального игрового кода (AI, макет / логика графического интерфейса, события / сообщения). Создание игр НАМНОГО веселее, когда вы можете быстро что-то изменить и протестировать без необходимости выходить, перекомпилировать и повторно инициализировать. Время от времени я сталкиваюсь с некоторыми проблемами с производительностью, но они легко решаются путем повторной реализации нарушающего кода в C ++ (а затем вызова его из Lua).

Хотя серверы EVE Online немного не по теме, они написаны почти полностью на Stackless Python (я полагаю, что они переносят большинство своих математических операций на библиотеку C ++), что значительно тяжелее, чем Lua, и, основываясь на моих личных исследованиях и нескольких доступных тесты, гораздо менее производительные, чем LuaJIT. Им удается обрабатывать более 30 тысяч одновременно работающих игроков без особых проблем. Конечно, у них есть тонна дорогого оборудования, на котором все это работает, но я полагаю, что большая часть затрат приходится на их кластер баз данных ...

Извинения за стену текста.


1
Отличный ответ! Не нужно извинений за столь подробный ответ. Я думаю, что найду время, чтобы разработать компоненты «действия», определенные в Lua, и провести некоторый сравнительный анализ. Спасибо!
BarakatX2

2
Самым большим ударом в таких системах обычно является разбор скриптов, поэтому обязательно загрузите его при запуске.
Coderanger

Это хороший момент. Я на самом деле компилирую свой Lua в байт-код перед упаковкой для релиза, что может еще больше сократить время загрузки, хотя я не проводил никаких измерений.
Codewaffle

Я склонен не соглашаться В то время как в обычной игровой логике это незначительная часть времени выполнения (рендеринг - зверь), на MMO-сервере это гораздо большая часть, поэтому влияние будет гораздо более существенным. У меня есть опыт работы с LUAJit и C ++, и, хотя LUAJit существенно быстрее, чем LUA, он все же намного медленнее, чем C ++ (при условии правильного кодирования C ++). Я признаю, что рабочий процесс с LUAJit - это круто, но по быстродействию он требует успеха. Независимо от того, как вы это делаете, переменные в таблицах с поиском строк, динамическими типами и сборкой мусора имеют свою цену. LUAJit медленнее, чем .NET, сказал Нуфф
Кай

2

Краткий ответ: да, да, будет.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.