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ść?
10
Odpowiedzi:
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.
źródło
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.
źródło