Czy używanie skryptów Lua do definiowania logiki gry dla serwera MMO byłoby znacznie wolniejsze niż kompilacja w C ++?


10

Używam systemu encji dla mojego serwera MMO i zastanawiałem się nad zdefiniowaniem zachowania „akcji” za pomocą skryptów Lua. Serwer jest napisany w C ++. Nie jestem zbyt obeznany z wykorzystaniem szybkości / pamięci Lua w C ++, ale użyłem jej do skryptowania GUI klienta. Czy użycie Lua do zdefiniowania logiki gry po stronie serwera znacznie obniżyłoby wydajność?


Odpowiedzi:


20

TL; DR: Lua ma koszty ogólne, ale przy właściwym zastosowaniu jest znikomy i łatwo można go złagodzić. Nie używaj go do ciężkich operacji matematycznych lub przekształcania geometrii. Prawdopodobnie nie zobaczysz żadnych problemów z wydajnością, używając go do skryptu GUI.

Zrobiłem kilka podstawowych testów porównawczych dotyczących wydajności Lua jako języka skryptowego do gry, i to jest cholernie szybkie. Używając tolua ++ do powiązania LuaJIT z moim silnikiem gry, stworzyłem 2000 aktorów, z których każdy jest kontrolowany przez skrypt Lua zwany każdą pętlą gry (z argumentem delta czasu). Połowa aktorów miała scenariusz uciekinierów, a druga połowa robiła coś w rodzaju przypadkowego spaceru (i stado ich unikało).

Wyłączenie komponentu renderującego dało mi nieco ponad 400 tyknięć na sekundę na moim Opteronie 170 (2x2,0 GHz, chociaż mój silnik był wtedy jednowątkowy). Wyobrażam sobie, że mógłbym wycisnąć znacznie więcej, gdybym wkopał i zoptymalizował, być może przenosząc część ciężkiej pracy z powrotem do C ++. Aktualizowanie 2000 aktorów 400 razy na sekundę było nadal imponujące i znacznie przekroczyło moje oczekiwania.

Teraz używam Lua we wszystkich moich projektach i stanowi ona całkiem sporą część rzeczywistego kodu gry (AI, układ / logika GUI, zdarzenia / wiadomości). Tworzenie gier jest o wiele przyjemniejsze, gdy możesz szybko coś zmienić i przetestować bez konieczności wychodzenia, ponownej kompilacji i ponownej inicjalizacji. Od czasu do czasu napotykałem pewne problemy z wydajnością, ale można je łatwo rozwiązać poprzez ponowne zaimplementowanie szkodliwego kodu w C ++ (a następnie wywołanie go z Lua).

Chociaż nieco nie na temat, serwery EVE Online są napisane prawie całkowicie w Stackless Python (sądzę, że odraczają większość swoich operacji matematycznych do biblioteki C ++), która jest znacznie cięższa niż Lua i, w oparciu o moje własne badania i kilka dostępnych testy porównawcze, znacznie mniej wydajne niż LuaJIT. Poradzą sobie z obsługą ponad 30 000 graczy jednocześnie bez zbyt wielu problemów. To prawda, że ​​mają mnóstwo drogiego sprzętu, ale wydaje mi się, że większość kosztów jest w klastrze baz danych ...

Przepraszamy za ścianę tekstu.


1
Świetna odpowiedź! Nie trzeba przepraszać za tak szczegółową odpowiedź. Myślę, że poświęcę trochę czasu, aby opracować „akcje” komponentu zdefiniowane w Lua i przeprowadzić testy porównawcze. Dzięki!
BarakatX2

2
Największym hitem w tego rodzaju systemach jest zazwyczaj parsowanie skryptów, więc pamiętaj, aby załadować go od razu przy starcie.
coderanger

To dobra uwaga. Właściwie kompiluję moją Luę do kodu bajtowego przed zapakowaniem do wydania, co może jeszcze bardziej skrócić czas ładowania, chociaż nie wykonałem żadnych pomiarów.
Codewaffle,

Nie zgadzam się. Podczas gdy w normalnej grze logika gry stanowi niewielką część czasu wykonania (rendering jest bestią), na serwerze MMO jest to znacznie większa część, więc wpływ byłby znacznie większy. Mam doświadczenie z LUAJit i C ++ i chociaż LUAJit jest zasadniczo szybszy niż LUA, to nadal jest znacznie wolniejszy niż C ++ (przy założeniu, że poprawnie kodujesz C ++). Przyznaję, że przepływ pracy w LUAJit jest niesamowity, ale pod względem szybkości wymaga on trafienia. Bez względu na to, jak go przekręcasz, zmienne w tabelach z wyszukiwaniem ciągów, typy dynamiczne i odśmiecanie mają swoją cenę. LUAJit działa wolniej niż .NET, nuff powiedział
Kaj

2

Krótka odpowiedź: tak, tak by było.

Długa odpowiedź: zależy od tego, ile logiki gry, ile jest uruchomiona i jak bardzo jest złożona oraz czy musisz ją uruchomić dla każdego gracza. Jeśli jest to bardzo proste i często się nie powtarza, możesz być w porządku. Ale w większości przypadków użycie LUA zamiast C ++ da ci znacznie niższą wydajność i źle skaluje, zakładając oczywiście, że kod jest dobrze zaprojektowany i zoptymalizowany.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.