Soluzione efficiente per il partizionamento dello spazio multiplayer?


10

Questa domanda è un po 'complicata, ma cercherò di chiarire.

Diciamo che sto costruendo un gioco online (non in scala MMO), ma che supporta il maggior numero possibile di giocatori, con un approccio server autorevole. Voglio mondi davvero grandi con molti nemici simulati dall'IA.

Sono a conoscenza di alcune strategie per salvare la CPU del server suddividendo lo spazio e non elaborando ciò che non necessita di elaborazione. Ho già diviso il mondo per regioni, che richiedono tempi di caricamento e piccole transizioni, che penso sia importante per mantenere la qualità del gioco quando giochi localmente (da solo o anche con un paio di amici). Non mi aspetto che i giocatori si trovino in più di una o due regioni.

Il problema è che una regione può diventare piuttosto grande e avere molti NPC che simulano contemporaneamente. Come posso gestirlo senza influire sull'esperienza dei giocatori? Approcci come un server per regione e simili non sono nella tabella.

Sono principalmente alla ricerca di strutture di dati per contenere orde di nemici e persino pacifici NPC. Per finalizzare la domanda, tieni presente che esistono veicoli, quindi è molto veloce viaggiare all'interno di una regione, influenzando il "quando" per abbattere le aree.


Sei limitato a un solo server fisico?
Patrick Hughes,

Alla fine no. Ma per semplicità e realizzabilità, per ora, non posso complicare ulteriormente il progetto :)
Grimshaw,

Inizia semplice. Qualcosa come WoW che opera su più caselle fisiche per "server" divide semplicemente il loro mondo in una griglia e tutti gli aggiornamenti si basano su chi si trova nelle tue stesse caselle. Molto semplice, facile da modificare, funziona bene e puoi usarlo con una sola scatola per controllare l'elaborazione.
Patrick Hughes,

Sono pienamente d'accordo con il tuo punto di vista e forse mi sono perso qualcosa nella mia domanda. E se ci fosse un giocatore all'estrema destra della casella "box" e un altro all'estrema sinistra della cella adiacente destra? Dovrebbero vedersi! Il mondo sembra continuare per un gioco come WoW .. Questo è ciò che non capisco, come creare una griglia mondiale continua, mantenendola efficiente? Certamente ci sono situazioni in cui i giocatori di due "server" dovrebbero vedersi :)
Grimshaw,

1
E sì, se hai un sacco di roba dappertutto e molti giocatori dappertutto devi davvero pianificare che tutto sia attivo ovunque e in ogni momento, nessun modo magico per aggirare questo. Questo è il motivo per cui le singole caselle di un gruppo di server MMO servono al massimo 200-500 giocatori E perché MMO AI per NPC è pateticamente stupido (ovvero economico da calcolare).
Patrick Hughes,

Risposte:


5

Da quello che ho capito avrai una sorta di fisica in esecuzione sul tuo server.

In tal caso, ci sono anche altre tecniche disponibili per AI / fisica oltre al partizionamento dello spazio. Dal più al meno ovvio:

  • priorità: gli NPC senza interazione diretta con i giocatori possono ricevere meno tempo della CPU riducendo la frequenza di aggiornamento. È possibile utilizzare le code di priorità ed eseguire le code con la priorità più alta dalla prima all'ultima, mentre le altre code eseguiranno solo 1/2, 1/4 o 1/8 della coda ogni ciclo. in questo modo ti assicuri che ogni oggetto venga eseguito ad un certo punto ma riduci il numero di volte che consuma CPU.
  • la fisica può anche essere abbassata (solo le scatole e le sfere di collisione possono essere utilizzate durante il roaming e lontano dalla vista).
  • semplificando l'intelligenza artificiale / simulazione assegnando comportamenti molto elementari agli NPC e all'ambiente mentre i giocatori sono lontani. Di solito sarà in roaming o alla ricerca di nemici invece di cacciare, raccogliere, coltivare ...
  • parte della fisica e dell'IA possono anche essere delegate ai clienti. Se davvero non disponi di CPU sui server, puoi contrassegnare l'oggetto come parzialmente risolto e i client regoleranno la fisica e la posizione di quegli oggetti localmente (per evitare NPC mobili). Ai clienti può essere data una certa responsabilità nell'esecuzione dell'IA (durante il combattimento contro un giocatore il dispositivo del giocatore bersaglio può eseguire direttamente gli NPC attaccanti)
  • per i giocatori, la fisica può anche essere ridotta sul server e i client riceveranno maggiori responsabilità nella risoluzione delle collisioni. Es .: colpisci un oggetto con il tuo veicolo, il server risolverà la collisione solo sulle scatole di collisione e taggerà gli oggetti come potenzialmente in collisione. Il client invierà la risoluzione al server con un timestamp che la accetterà se gli oggetti sono taggati e la soluzione sembra corretta.

Una volta implementati questi meccanismi, puoi decidere quanto e quanto spesso ne hai bisogno. Il bello di questo è che in seguito è possibile aggiungere alcuni server che saranno in grado di assumere alcune delle attività anziché le app client.

Naturalmente il rilevamento approssimativo della collisione creerà delle aberrazioni, ma sarai in grado di risolverle aggiungendo di volta in volta maggiore precisione.

Anche per quanto riguarda la fisica dovresti dare un'occhiata alle librerie che supportano una sorta di sistema GPGPU come OpenCL o CUDA se hai accesso a un server che supporta entrambi.


La combinazione del partizionamento dello spazio di una regione con gli aggiornamenti prioritari dovrebbe essere esattamente ciò di cui ho bisogno, ottimale per piccole quantità di giocatori e comunque ottimizzato quando vengono caricate molte aree. Grazie.
Grimshaw,

@DevilWithin Dovrebbe aiutare e non richiede modifiche sul lato client. Ho anche aggiunto alcuni dettagli in più alla risposta.
Coyote

L'intelligenza artificiale semplificata è un'idea meravigliosa. Mentre gli NPC sono lontani dai giocatori, nella maggior parte dei casi non devono fare altro che muoversi. Ciò significa che posso solo fare un'approssimazione di ciò che stanno facendo, ogni 1 minuto o qualcosa del genere, solo per farli vagare per il mondo .. immaginandoli come zombi, lo farebbero!
Grimshaw,
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.