Чи буде використання сценаріїв Lua для визначення логіки гри для сервера MMO набагато повільніше, ніж компільовано в C ++?


10

Я використовую систему сутності для свого сервера MMO, і я думав про визначення поведінки "дій" за допомогою скриптів Lua. Сервер написаний на C ++. Я не дуже добре знайомий зі швидкістю / використанням пам'яті Lua в C ++, але я використовував її для створення графічного інтерфейсу клієнта. Чи вдасться за допомогою Lua визначити логіку гри на стороні сервера, зменшивши продуктивність на багато?


Питання, пов’язані з цим: gamedev.stackexchange.com/questions/2913/…
Tetrad

Відповіді:


20

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

Я зробив кілька основних орієнтирів щодо продуктивності Lua як мови сценаріїв гри, і це досить чортово швидко. Використовуючи tolua ++, щоб прив’язати LuaJIT до свого ігрового двигуна, я породив 2000 акторів, кожен актор, керований сценарієм Lua, який називається кожним циклом гри (з аргументом часу-дельта). Половина акторів мала сценарій зграйку, а інша половина робила щось на кшталт випадкової прогулянки (і їх отара уникала).

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

Зараз я використовую Lua у всіх своїх проектах, і він фактично становить досить велику частину фактичного коду гри (AI, макет / логіка графічного інтерфейсу, події / повідомлення). Створення ігор набагато веселіше, коли ви можете швидко щось змінити та протестувати, не виходячи з перекомпіляції та повторної ініціалізації. Час від часу я стикався з деякими проблемами продуктивності, але їх легко вирішити шляхом повторного внесення коду, що порушує в C ++ (а потім викликає його від Lua).

Хоча трохи поза темою, сервери EVE Online майже повністю написані на Stackless Python (я вважаю, що вони відкладають більшість своїх математичних операцій на C ++ lib), що значно важче, ніж у Lua, і, грунтуючись на моїх власних особистих дослідженнях та кількох доступних орієнтири, набагато менш ефективні, ніж LuaJIT. Їм вдається обробляти 30k + одночасних гравців без занадто багато проблем. Зрозуміло, у них є тонна дорога апаратна техніка, на якій працює все це, але я вважаю, що більша частина витрат лежить у їх кластерній базі даних ...

Вибачення за стіну тексту.


1
Чудова відповідь! Не потрібно вибачень за таку детальну відповідь. Я думаю, що я знайду час, щоб розробити компоненти "дії", визначені в Lua, і зробити деякий бенчмаркінг. Дякую!
BarakatX2

2
Найбільшим хітом у подібних системах зазвичай є аналіз сценаріїв, тому обов'язково попередньо завантажте це під час запуску.
кодеранджер

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

Я схильний не погоджуватися. Якщо в звичайній ігровій логіці логіка є незначною частиною часу виконання (візуалізація є звіром), то на сервері MMO це набагато більша частина, тому вплив буде набагато суттєвішим. У мене є досвід роботи з LUAJit і C ++, і хоча LUAJit істотно швидше, ніж LUA, він все ще набагато повільніше, ніж C ++ (якщо вважати, що ви C ++ правильно). Я визнаю, що робочий процес з LUAJit є приголомшливим, але швидше він робить удар. Незалежно від того, як ви їх скручуєте, змінні в таблицях із пошуковими рядками, динамічними типами та збиранням сміття мають ціну. LUAJit повільніше, ніж .NET, nuff сказав
Kaj

2

Коротка відповідь: Так, так.

Довга відповідь: Це залежить від того, яка логіка гри, скільки вона виконується, і наскільки вона складна, і якщо вам потрібно запустити її для кожного гравця. Якщо це дуже просто і не повторюється багато, ви можете з цим добре. Але в більшості випадків використання LUA замість C ++ дасть вам набагато нижчу продуктивність і погано масштабується, якщо, звичайно, передбачається, що код добре розроблений та оптимізований.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.