Quali dati devono essere memorizzati nella cache in un server multiplayer, rispetto all'IA e ai giocatori?


8

In un luogo virtuale, completamente guidato dalla rete, con un numero arbitrario di giocatori e un numero arbitrario di nemici, quali dati devono essere memorizzati nella memoria del server, al fine di ottimizzare la simulazione dell'IA?

Cercando di spiegare, diciamo che il giocatore A vede il giocatore da B a E, e il nemico da A a G. Ciascuno di quei giocatori, vede il giocatore A, ma non necessariamente l'uno con l'altro. Lo stesso vale per i nemici. Pensa a questa domanda da una prospettiva dall'alto verso il basso, per favore.

In molti casi, ad esempio, quando un giocatore spara la sua pistola, il server gestisce il suono come un "segnale" radiale che ogni altra entità a portata di mano "sente" e reagisce.

Fare queste ricerche in continuazione per un'intera area, contenente probabilmente molti giocatori e nemici non collegati, sembra essere un problema, quando il budget per ciascun agente di intelligenza artificiale è così ridotto.

Ogni entità dovrebbe memorizzare nella cache tutto ciò che entra ed esce dal suo raggio di consapevolezza? C'è un ottimo modo per rintracciare le entità vicine senza inondare la memoria con tali cache?

Che dire di altri problemi legati all'intelligenza artificiale che possono sorgere, dopo aver assunto che il precedente funzioni bene? Stiamo parlando di ambienti con forse centinaia di nemici, uno sciame.


Dipende un po 'dal numero di giocatori e AI e simili nel gioco. Ad esempio, gli MMO usano cose come i grafici delle scene per una rapida ricerca di chi è vicino a ciò che per cose come te menzionate sopra mentre un gioco FPS che sta monitorando solo 30 cose in totale, sarebbe eccessivo e probabilmente è solo un elenco collegato di 30 entità abbastanza. Puoi essere un po 'più specifico nelle tue impostazioni? Con solo 5 giocatori e 7 AI, direi che non è necessario fare nulla di speciale oltre a tutte le 13 entità caricate in memoria normalmente.
James,

Un caso assolutamente medio del mondo di gioco è come tale: oltre 20 regioni, come in città e dintorni. Ogni regione è ciò che stiamo prendendo in considerazione qui ed è suddivisa in modo ricorsivo per aree, come da grafico della scena, come hai detto. Un'area può essere ancora più grande della consapevolezza dell'entità e può contenere perfettamente 100 nemici o più e QUALSIASI numero di giocatori. Sicuramente ci sono aree vuote, ma anche sovraffollate
Grimshaw il

1
Sono abbastanza interessato dal feedback su questa domanda.
Coyote,

Risposte:


7

Esistono diversi modi per farlo, ma dipendono da dove avrai una grande quantità di interazioni o una popolazione molto densa.

Sfortunatamente, se vuoi che la tua simulazione mantenga una buona precisione, dovrai gestire la maggior parte degli eventi generati da tutti gli attori e trovare tutti / la maggior parte degli attori che richiedono una notifica.

Collisioni economiche

Per quanto riguarda il problema con le aree di consapevolezza, è possibile risolverlo utilizzando un semplice rilevamento delle collisioni.

In un mondo 2d, il rilevamento delle collisioni sui cerchi è "economico". Ad esempio, l'operazione per rilevare se un punto si trova in un cerchio richiede solo 2 sottrazioni, 2 moltiplicazioni e un'aggiunta. Non è necessario eseguire la radice quadrata poiché è possibile memorizzare e confrontare direttamente il raggio quadrato della propria area con la distanza quadrata.

Se usi il cerchio 2d in un mondo 3d, funzionerà sostanzialmente come un cilindro. Può essere un modo conveniente per creare aree se l'altezza non è molto importante.

Raggio orientato agli eventi

Se il volume degli eventi (antincendio, movimento ...) è basso, puoi provare a rilevare ogni attore interessato da ciascun evento. I tuoi eventi genereranno aree (dove possono essere ascoltati).

Questo è il metodo più semplice da implementare, è anche il più flessibile in quanto è possibile raccogliere gli impatti di proiettili / proiettili provenienti da attori al di fuori di un'area di consapevolezza.

D'altra parte, una volta aumentato il volume degli eventi, potrebbe essere necessario ridurre il numero di eventi che attivano le scansioni dell'area o il numero di attori scansionati per evento.

-> È inoltre possibile creare piccole zone (di eventi) in cui tutti gli eventi vengono registrati insieme ed elaborati in blocco (ovvero 2 impatti di proiettili e un passo in corso in una zona utilizzeranno solo una scansione e verranno inviati a tutte le entità interessate). <-

Aree orientate all'attore

È possibile utilizzare il principio "area di consapevolezza". Ad esempio, se un attore si scontra con l'area di consapevolezza (cerchia) di un altro attore, aggiungi semplicemente l'attore in collisione a un elenco di attori potenzialmente interagenti. A seconda di come viene costruito il tuo motore, puoi quindi registrarti per messaggi sonori e altri eventi provenienti dagli attori nell'elenco.

Per verificare il contatto visivo, è anche possibile eseguire scansioni visive solo nell'elenco degli attori registrati.

Non è necessario verificare la presenza di cambiamenti nell'area di consapevolezza ad ogni tick. Puoi farlo di volta in volta, ad esempio ogni 5-30 tick.

Se gli elenchi iniziano a crescere, puoi limitarli a una dimensione massima. Ma poi dovrai dare la priorità agli attori da aggiungere / scambiare nelle liste.

Approccio misto

Puoi mescolare entrambi gli approcci. È possibile registrare attori in aree di consapevolezza per eventi come passi del piede, nasi del motore, ecc ... E altri eventi (impatti di proiettili, esplosioni, ecc ...) possono innescare scansioni in base alla loro importanza. C'è una probabilità molto più alta che qualcuno ascolti un'esplosione di granate rispetto all'impatto di un proiettile, quindi l'esplosione di granata dovrebbe innescare una scansione più ampia dell'impatto del proiettile.

Ti consiglio di iniziare a implementare prima il raggio dell'evento. Una volta che questo funziona e sei in grado di ridurre / aumentare la precisione di questo metodo, puoi iniziare a implementare le aree di consapevolezza dell'attore. In questo modo sarai in grado di iniziare a spostare alcuni eventi sul secondo sistema.

Pool di contesti

Non tutti gli attori devono essere informati di tutti gli eventi. Ad esempio, una torretta antiaerea non deve essere informata degli impatti dei proiettili e dei passi attorno ad essa, anche la presenza di unità di terra potrebbe essere ignorata per alcune unità.

Se trovi molti casi speciali, puoi creare diversi pool di aree di consapevolezza. Un attore può rendere attiva la propria area di consapevolezza in più pool. Ad esempio, potresti voler che le tue unità terrestri reagiscano alle unità terrestri solo mentre alcune unità missilistiche e dotate di laser potrebbero reagire anche alle unità aeree. Gli aeromobili non devono mai essere informati di impatti al suolo diversi dalle esplosioni ...

Ovviamente non è necessario creare più "elenchi" per i pool. Puoi semplicemente usare una maschera di bit e impostare la maschera giusta per ogni attore / area. In questo modo è possibile filtrare con un semplice o prima di controllare la distanza.

Aggregazione

Se vedi le liste in ogni area di consapevolezza crescere e la memoria è scarsa, puoi aggregare aree di consapevolezza per gruppi di nemici (squadre, squadre, plotoni, stormi, sciami ...) purché rimangano vicini gli uni agli altri. In questo modo un'intera squadra può registrarsi per eventi o altri attori / gruppi che entrano nella sua area di consapevolezza.

Fondamentalmente l'entità del gruppo diventa un sostituto / proxy per tutte le scansioni mentre tutti i membri del gruppo vengono rimossi dai pool.

Questo principio può essere applicato anche a tutte le unità all'interno di un veicolo.

Attivazioni di prossimità

Se il server è davvero sovrappopolato di bot (e hai davvero bisogno di tenerli tutti in vita), puoi solo attivare la consapevolezza / AI su quelli all'interno di una speciale "area di attivazione attorno a ciascun giocatore". In questo modo i robot (o gruppi) all'interno di una o più aree di attivazione si mantengono attivi e la loro area di consapevolezza attiva (nel pool di collisioni). Altrimenti la loro area di consapevolezza viene rimossa dal pool (s) di aree attive.

La frequenza con cui tali "aree di attivazione" cercano "aree di consapevolezza" può variare a seconda della velocità del lettore. Un giocatore che viaggia a velocità più alta innescherà più attivazioni di un giocatore che accampa una zona (necessario almeno per attivare i robot in roaming e disattivare i robot che lasciano l'area).

Inoltre puoi disattivare l'area di attivazione di un giocatore se sale a bordo di un veicolo e assegnare un'area di attivazione al veicolo se non ne ha una. In questo modo 10 giocatori che viaggiano nello stesso veicolo non devono avere 10 aree di attivazione.

Delegazione

Se non si temono imbroglioni e altri produttori di problemi, è possibile delegare parte del rilevamento degli eventi all'applicazione client.

Il server può inviare periodicamente un elenco di attori vicini (robot e giocatori) che verranno avvisati dalle app client. L'applicazione client dovrà eseguire la scansione e il rilevamento degli eventi per tutti gli eventi generati dal lettore. Ad esempio, può inviare l'elenco degli attori per avvisare di un colpo, di un impatto di proiettile o di passi.

Questa è un'opzione, può essere valida a seconda del tipo di gioco che stai realizzando. Questa è un'idea teorica e non consiglierei di farlo finché non avrai il pieno controllo sui client delegati (server bot o client sicuri).


Spero che questo possa essere d'aiuto.


La tua risposta sembra definire la maggior parte dei metodi disponibili, fantastici! Fare un mix di tutto sembra una buona scelta, per un'applicazione così critica per le prestazioni, tutto dovrebbe essere fatto in dettaglio, evitando eccessivo qua e là. Inoltre, penso davvero che se il cliente è autorevole su QUALCOSA, può e sarà truffato: P
Grimshaw,

Sì ... ma se puoi delegare alcune cose al client ora sarai in grado di delegare a server secondari in seguito se vuoi, limitando la delega solo ai server e disabilitandola sui client. Solo un'idea però :)
Coyote

È una buona idea, ma i giocatori sfrutteranno sempre quando diventerà competitivo ... Sono più a favore dell'utilizzo della potenza di elaborazione del client per piacere e cose per migliorare l'esperienza, il suono, la grafica ecc. Il server non ha bisogno di tracciare tutto, alcuni cose che il cliente può assumere senza permettere barare. Comunque, grazie MOLTO per la risposta, di nuovo, aiuterà a bilanciare le cose!
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.