2012-04-29 17 views
10

Sto solo pensando alla possibilità di Erlang per il server di gioco. (oh non sono un esperto di Erlang, considerando solo lo stage) Questo significa usare Actor Model per la simulazione del gioco. Naturalmente, la più grande attrazione è la concorrenza distribuita su più nodi.Rilevamento di collisione e modello di attore

La mia attuale enorme domanda è come devo eseguire interazioni multi-attore come il rilevamento delle collisioni. (questo è solo un esempio)

Sebbene il rilevamento delle collisioni sia essenzialmente richiesto in qualsiasi gioco, ma nella natura di Actor Model, non sembra efficiente e persino non ha senso, perché necessita di query di stato sincronizzate a livello globale e aggiornare su tutti gli attori di targeting. E se utilizzo una qualsiasi sincronizzazione, ha la precedenza su tutti i vantaggi del modello di attore di Erlang.

Ovviamente il targeting degli attori alla volta può essere minore se utilizzo correttamente il partizionamento dello spazio, ma è solo un'ottimizzazione, non una risposta principale. O è questa una risposta corretta per questa domanda? Diminuzione della gamma di sincronizzazione diminuendo il numero di attori interagenti?

risposta

9

Dividi la mappa in parti più piccole e lascia che ogni parte sia il suo processo (puoi persino dividerlo così tanto che ogni tessera è il suo processo). Un giocatore che sta tentando di muovere invierà un messaggio alla tessera/sottocampo dicendo che sta andando lì, e la tessera risponde se va bene o no. Questo evita collisioni poiché solo un messaggio viene gestito dalla tessera/sottocartella alla volta. Più sotto-mappe/tile possono gestire i messaggi contemporaneamente, quindi è ancora un programma concorrente.

+0

L'intervallo di interazione ridotto è l'unica via percorribile. Grazie. – Eonil

7

Ho un gioco spaziale che fa il server in Erlang. Il trucco è che ogni posizione/nodo/etc è anche un attore. Gestisce continuamente la fisica e invia regolarmente le informazioni a ciascun attore dell'entità di gioco.

Il tutto diventa molto più pulito quando inizi a pensare in modo più astratto a cosa sia un attore/entità. Ad esempio, le collisioni possono essere attori a pieno titolo. Questo rende il lato client molto più facile - lega gli effetti grafici e sonori alla collisione. Dal lato server, fa anche questo: previeni più effetti di collisione tra due entità più di una volta in un dato momento.

+0

Quindi tutta la fisica è stata eseguita in attore singolo? Come hai fatto a fare la fisica? – Eonil

+2

Sì. Sto usando Bullet per eseguire la fisica. Gli attori di entità tracciano il proprio stato di gioco, si sparano a vicenda, decidono il movimento, ecc. Mandano i comandi alla posizione, che esegue le simulazioni. La posizione viene eseguita continuamente e invia periodicamente "siete qui" alle entità e "vi siete scontrati con X". Anche le entità inviano query al luogo. – Nialscorva