Memorizzazione delle coordinate di ogni oggetto nel lato server in MMO


12

In un MMORPG:

È tipico o fattibile memorizzare le coordinate di ogni albero, cespuglio di roccia, ecc. Sul lato server per il rilevamento delle collisioni?

In tal caso, quale sarebbe un modo fattibile per memorizzare un numero così elevato di coordinate (strutture di dati e simili, gestione dei problemi di prestazione)?

In caso contrario, questo tipo di rilevamento delle collisioni viene eseguito interamente nel lato client, con il server che non controlla affatto?

O c'è una via di mezzo, con il client che controlla la collisione e il server che verifica? In tal caso, come verificherebbe il server lo stesso senza mantenere anche le coordinate nel server?


2
Non ne so abbastanza per dare una buona risposta, ma se fai il rilevamento delle collisioni solo sul lato client, i truffatori troveranno un modo per aggirare tutto o raccogliere power-up a miglia di distanza da loro.
Peethor,

2
-1 "La domanda non mostra alcuno sforzo di ricerca".
Vaillancourt


in realtà, probabilmente non un duplicato, ho appreso degli schemi di partizione spaziale e delle strutture di dati spaziali che l'altra domanda non aveva
Sajith Dilshan Jamal

Risposte:


15

Indipendentemente dalla fattibilità (sì, a seconda della scala) ci sono spesso modi migliori o più facili.

Ad esempio, nel tuo MMO tipico, il server deve davvero conoscere solo la mappa di navigazione approssimativa utilizzata dall'IA e dal percorso del giocatore. Invece di memorizzare la posizione di un albero, puoi invece tagliare un buco nella navmap nella posizione dell'albero. Allo stesso modo per qualsiasi altro grande ostacolo.

Anche i giochi che richiedono un rilevamento più approfondito delle collisioni, spesso possono essere suddivisi in rilevamento lato server e lato client. Il server può occuparsi solo di un percorso approssimativo mentre il client gestisce un rilevamento delle collisioni più sensibile all'animazione. Ad esempio, un giocatore ferito cerca di strisciare lungo una grande roccia per trovare un nascondiglio dai nemici. Il server determina che un giocatore potrebbe spostarsi lungo il bordo della roccia (il server non ha idea che ci sia una roccia, solo che c'è un percorso che il giocatore può percorrere vicino a un'area non percorribile) mentre il client sa che la roccia è presente e riproduce un'animazione del personaggio che si appoggia allo scoglio mentre cammina. Si noti che il client non si sta spostandoil personaggio o il gameplay che influisce in alcun modo in questo caso; sta solo reagendo agli oggetti vicini con un'animazione.

È sicuramente possibile memorizzare un gran numero di oggetti sul server. Non è diverso da qualsiasi gioco open world. Usa un buon schema di partizionamento spaziale e mantieni il footprint di memoria dei tuoi oggetti il ​​più leggero possibile. Nota che qui potremmo avere diverse versioni di "numeri grandi" nelle nostre teste: se volevi dire che volevi conservare ogni piccolo sassolino o sbalzo roccioso nel gioco come un oggetto separato, allora è solo sciocco, anche per una partita a giocatore singolo . :)


7

Sì, è fattibile. Gli MMO spesso dividono il mondo di gioco in più aree, in quanto ciò semplifica il lavoro, ma puoi ancora farlo con 1 area enorme: devi solo usare un buon schema di partizionamento spaziale.

Poiché la maggior parte degli oggetti nei MMO non si sposta, è anche possibile eseguire un passaggio di preelaborazione in cui gli oggetti vengono utilizzati per creare alberi per il controllo delle collisioni.

L'impronta di memoria non è un grosso problema qui, purché usi l'istanziazione. Memorizzare un paio di galleggianti per oggetto non è nulla nel grande schema delle cose. Un PC modesto al giorno d'oggi avrà 4 gigabyte, mentre la memorizzazione di una posizione è di soli 3 float (o 3 doppi), il che consentirebbe facilmente diversi milioni di oggetti memorizzati nel gioco.

Memorizzare cose come inventari per ogni giocatore richiederebbe senza dubbio più dati, anche se possono essere facilmente memorizzati nella cache su disco e caricati solo quando un giocatore accede.

Ti consigliamo di eseguire in modo ridondante il controllo delle collisioni sul client e sul server, in quanto ciò consentirà al client di reagire in modo più reattivo all'ambiente. Se un giocatore entra in un muro, vuoi che smetta immediatamente di muoversi, non dopo mezzo secondo quando il server risponde.

Vuoi usare il server anche solo per cose autorevoli. Ad esempio, eseguiresti il ​​pathfinding solo sul client, poiché non puoi imbrogliare prendendo un percorso meno efficiente!


grazie per il suggerimento sugli schemi di partizionamento spaziale, ho imparato qualcosa di nuovo
Sajith Dilshan Jamal
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.