L'uso degli script Lua per definire la logica di gioco per un server MMO sarebbe molto più lento di quanto compilato in C ++?


10

Sto usando un sistema di entità per il mio server MMO e stavo pensando di definire il comportamento delle "azioni" usando gli script Lua. Il server è scritto in C ++. Non ho molta familiarità con l'utilizzo della velocità / memoria di Lua in C ++ ma l'ho usato per creare script sulla GUI del client. Usare Lua per definire la logica di gioco sul lato server ridurrebbe di molto le prestazioni?


Risposte:


20

TL; DR: Lua ha un overhead, ma se usato correttamente è trascurabile e facilmente mitigabile. Non utilizzarlo per operazioni matematiche pesanti o per trasformare la geometria. Probabilmente non vedrai alcun problema di prestazioni usandolo per lo script di una GUI.

Ho fatto alcuni benchmark di base per quanto riguarda le prestazioni di Lua come linguaggio di scripting di gioco, ed è abbastanza veloce. Usando tolua ++ per legare LuaJIT al mio motore di gioco, ho generato 2000 attori, ogni attore controllato da uno script Lua chiamato ogni ciclo di gioco (con un argomento time-delta). La metà degli attori aveva una sceneggiatura in affollamento e l'altra metà stava facendo una sorta di camminata casuale (e fu evitata dal gregge).

La disattivazione del componente di rendering mi ha dato un po 'più di 400 tick al secondo sul mio Opteron 170 (2x2.0GHz, anche se il mio motore era a thread singolo al momento). Immagino che avrei potuto spremerci un po 'di più se avessi scavato e ottimizzato, forse spostando parte del lavoro pesante in C ++. Aggiornare 2000 attori 400 volte al secondo era ancora piuttosto impressionante, e all'epoca superava di gran lunga le mie aspettative.

Ora uso Lua in tutti i miei progetti, e in realtà costituisce una parte considerevole del codice di gioco effettivo (AI, layout / logica della GUI, Eventi / Messaggi). Rendere i giochi è MOLTO più divertente quando puoi cambiare rapidamente qualcosa e testarlo senza dover uscire, ricompilare e reinizializzare. Di tanto in tanto ho riscontrato alcuni problemi di prestazioni, ma questi sono facilmente risolti reimplementando il codice offensivo in C ++ (e quindi chiamandolo da Lua).

Sebbene leggermente fuori tema, i server di EVE Online sono scritti quasi completamente in Stackless Python (credo che rinviano la maggior parte delle loro operazioni matematiche a una libreria C ++), che è considerevolmente più pesante di Lua e, sulla base delle mie ricerche personali e di numerosi disponibili benchmark, molto meno performanti di LuaJIT. Riescono a gestire 30k + giocatori simultanei senza troppi problemi. Certo, hanno un sacco di hardware costoso che esegue tutto questo, ma credo che la maggior parte dei costi sia nel loro cluster di database ...

Ci scusiamo per il muro di testo.


1
Bella risposta! Non sono necessarie scuse per una risposta così ben dettagliata. Penso che mi prenderò il tempo per sviluppare "azioni" componenti definite in Lua e fare alcuni benchmarking. Grazie!
BarakatX2

2
Il più grande successo in questo tipo di sistemi è di solito l'analisi degli script, quindi assicurati di caricarlo in anticipo all'avvio.
coderanger,

Questo è un buon punto. In realtà ho compilato il mio Lua in bytecode prima dell'imballaggio per il rilascio, il che può ridurre ulteriormente i tempi di caricamento, anche se non ho effettuato alcuna misurazione.
Codewaffle,

Tendo a non essere d'accordo. Mentre in un normale gioco la logica di gioco è una parte minore del tempo di esecuzione (il rendering è una bestia), in un server MMO è una parte molto più grande, quindi l'impatto sarebbe molto più sostanziale. Ho esperienza con LUAJit e C ++ e mentre LUAJit è sostanzialmente più veloce di LUA, è ancora molto più lento di C ++ (supponendo che il codice C ++ sia corretto). Devo ammettere che il flusso di lavoro con LUAJit è fantastico, ma che ha subito un successo. Indipendentemente da come lo distorci, le variabili nelle tabelle con ricerche di stringhe, tipi dinamici e garbage collection hanno un prezzo. LUAJit è più lento di .NET, ha detto Nuff
Kaj,

2

Risposta breve: Sì, sì, lo sarebbe.

Risposta lunga: dipende da quanta logica di gioco, da quanto viene eseguito, da quanto è complessa e se è necessario eseguirla per ogni giocatore. Se è molto semplice e non si ripete molto, potresti star bene. Ma per la maggior parte dei casi l'uso di LUA anziché C ++ ti darà prestazioni molto più basse e scalerà male, supponendo ovviamente che il codice sia ben progettato e ottimizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.