Enormi oggetti statici come l'ambiente vengono trasmessi dal server al client nei moderni giochi multiplayer?


18

Ho un sistema autorevole, in cui quando il giocatore si unisce alla partita, ottiene tutti gli oggetti già generati - generati su se stesso (il client).

Sembra così:

  1. Client invia il token di accesso a Server
  2. Client riceve l'accettazione da parte di Server
  3. Client cambia scena alla scena di gioco
  4. Serverinvia giocatori, casse, oggetti con i quali puoi interagire in modo che clientpossano essere generati e mostrarli.

Ma che dire dell'oggetto terra? Per ora, ho la stessa identica scena sul server e sul client - con un piano statico che funge da piano. Attualmente sto aggiungendo nuove cose, alberi, scale e costruendo cose insieme.

Ho pensato: stiamo bene. Ma anche l'ambiente non dovrebbe essere sincronizzato? Essere in rete in qualche modo? Di proprietà del server?

Prendiamo League of Legends:

inserisci qui la descrizione dell'immagine

È un ambiente statico, probabilmente una maglia combinata (scale, erba, pareti, negozio). Ma è davvero tenuto sul client o viene inviato dal server durante la schermata di caricamento?


1
Puoi anche pensarci dal punto in cui puoi aggiungere skin personalizzate ai personaggi e all'ambiente della lega. Non li mandi a sever, sono visualizzati localmente, quindi ha senso giungere alla conclusione che sono memorizzati e resi localmente. Inoltre, non influenzano il gameplay, se stai chiedendo delle collisioni, sono un mix di server e client, quindi quel giocatore non può imbrogliare e attraversare i muri.
Candid Moon _Max_

Risposte:


41

Per la maggior parte, no, le risorse artistiche di qualsiasi tipo non vengono inviate di routine attraverso la rete. Generalmente tutti i clienti avranno localmente le stesse risorse di contenuto. Potrebbe esserci un codice per garantire che ciò avvenga tramite il checksum del contenuto o simili. Se sei preoccupato che gli utenti manomettano alcuni dei loro contenuti sul lato client, puoi implementare un sistema simile.

Il server potrebbe inviare direttive al client indicando che dovrebbe visualizzare o nascondere determinati asset, ma non invierà i dati effettivi dell'asset. Questo è, in pratica, troppo dispendioso e lento e potrebbe causare problemi reali con persone con dati limitati disponibili.

In alcuni casi, le attività più piccole possono essere trasmesse in streaming nella loro interezza se l'attività è in qualche modo considerata uno "spoiler" o altro. Ma è raro. Generalmente, ciò che vedi è che un gioco potrebbe scaricare nuovi contenuti da una patch, o altro, ma ciò accadrà solo una volta, durante il processo di patching all'avvio. Non durante il gioco.


21
Nota che questa risposta riguarda solo le risorse statiche. Dovranno essere trasmessi beni dinamici / generati dal giocatore (ad es. Pezzi di Minecraft o loghi di gilda MMORPG che i giocatori possono caricare). Ma anche allora di solito si cerca di ridurre al minimo la quantità di dati necessari (per continuare l'esempio di Minecraft: invio di aggiornamenti di blocco anziché interi blocchi, indicando solo il tipo / stato del blocco e le coordinate che sono cambiate) e / o memorizza nella cache i dati sul lato client .
hoffmale,

@hoffmale Sì, buon punto; la domanda diceva che il paesaggio era statico alla fine, quindi non pensavo di sollevare quel punto, ma è buono.

3
Se una risorsa è uno spoiler, in genere la risorsa si trova sul client, crittografata e la chiave di decrittazione viene trasmessa dal server al client quando è necessaria la risorsa.
Grant Davis,

4
E per esempio se hai bisogno di posizionare casualmente alberi su una mappa, invece di inviare le coordinate degli alberi al client, invia il seme (del generatore di numeri casuali) al client.
Grant Davis,

5

Dipende da diversi fattori, incluso il tipo di gioco (suppongo qui RTS, anche se mi viene in mente MMO open world). Uno stato del terreno di base, da giocatore a giocatore, viene inviato al momento della connessione o fa parte delle risorse del cliente: pensa a un gioco RTS in cui la mappa viene spedita con il cliente o viene scaricata prima dell'inizio del gioco.

In effetti, la mesh di solito non viene inviata, come sarebbe già sul client nella maggior parte dei casi RTS. Se la mappa di collisione, che è ciò che è veramente cruciale per mantenere sincronizzati i due , è un'altra domanda. Ma nella maggior parte degli RTS, questo sarebbe di nuovo pre-memorizzato sul client.

Quindi davvero, tutto dipende da cosa viene spedito il tuo RTS, se scarichi le mappe prima del tempo di gioco o nel momento in cui inizia il gioco.

Successivamente, ci sono alcuni modi tipici per rimanere sincronizzati:

  • I delta vengono inviati al client - il modo più comune ed efficiente per mantenere aggiornato il mondo locale / client con il server;
  • I checksum vengono occasionalmente inviati da server a client o da client a server per garantire che lo stato mondiale corrisponda effettivamente;
  • Occasionalmente, lo stato completo viene rinviato per risincronizzare il client, spesso a causa di problemi tecnici come la deriva in virgola mobile.

4

Per quanto riguarda la tua domanda esatta, non so come League of Legends la gestisca in modo specifico. Non ho mai giocato a quel gioco, quindi non posso suggerire se sia necessario o meno.

Ma la risposta alla tua domanda, in generale, è abbastanza semplice e diretta:

Se i dati sono statici e sai per certo che non cambieranno mai (a parte gli aggiornamenti periodici di gioco completo, ma è separato), perché mai vorresti mai inviare quei dati extra? Di solito si tenta di evitare di inviare qualsiasi cosa si possa evitare. Invia i dati solo se tale comunicazione è necessaria .

D'altra parte, se i dati cambieranno nel tempo , o se vuoi solo lasciare aperta questa opzione, allora hai davvero qualche scelta in merito? In questo caso, è necessario inviare i dati. Altrimenti il ​​cliente non ha ciò di cui ha bisogno.

Questo vale per tutte le comunicazioni di rete, non solo per i dati del terreno. Tutto .


2

No.

Ho fatto una specie di approfondimento sulla fonte di League of Legends e tutto, inclusi i modelli Champion, il negoziante, lo sfondo della mappa generale e le creature lanugine aggiunte dopo il fatto (come il piccolo scoiattolo su alcune rocce e una lumaca in il fiume) sono tenuti sul lato client. Il fatto che il client abbia tutti questi modelli è uno dei motivi per cui LoL ha dimensioni di molti gigabyte.

Il trasferimento di tutti questi dati dal server al client sarebbe infernale, per non parlare dell'uso della larghezza di banda solo per rifare tutto il gioco successivo.

Allora come si risolve allora? Ogni giocatore invia al server SOLO i dati che contano per gli altri giocatori nel gioco. Nessuno ha bisogno di sapere se ti rimangono 5 secondi sul tempo di recupero di Q o se Deep Skin per il terrore crea bolle per te. Le cose che passano nel gioco sono cose come, Vel'Koz ha lanciato Q, Viktor si è spostato a sinistra, ecc ...

Più esplicitamente, in relazione al caricamento dello schermo, mentre lo hai sollevato, cose che accadono ci sono cose come patch di metà patch, di cui ogni giocatore ha bisogno di parlare con i server di riot prima dell'inizio del gioco, strette di mano di connessione sicure e protocolli anti cheat.

NOTA:

Se vuoi dare un'occhiata a ciò che il client ha, e quindi il server non ti passa, trova la cartella C: \ Riot Games \ RADS \ lol_Game_Client \ Projects (che potrebbe essere un po 'fuori, scusami io' ' sto lavorando subito con la memoria) e trovo un file packer .RAF unpacker online. Quindi puoi vedere tutto ciò che è ospitato localmente come il caricamento di schizzi dello schermo e texture della pelle, persino campioni di scheletri.


1
Sembra che il modo ovvio per implementare questo sarebbe avere la richiesta del client (da un server di risorse dedicato) qualsiasi risorsa che non abbia già archiviato localmente e quando li riceve, li aggiunge (semi) permanentemente al suo archivio persistente locale su disco. In questo modo le risorse vengono scaricate una sola volta e solo quando sono effettivamente necessarie. (Una volta che funziona, un'ottimizzazione sarebbe quella di precompilare il negozio locale del cliente con risorse che molto probabilmente sarebbero necessarie. Ciò ridurrebbe i tempi di avvio del gioco al primo collegamento, a costo di allargare il pacchetto di installazione del gioco)
Jeremy Friesner,

1
@JeremyFriesner Perché sarebbe quello il modo ovvio? Suona peggio dell'attuale implementazione descritta in questo post, che ti ha installato tutte le risorse in anticipo in modo da averle immediatamente disponibili quando ne hai bisogno. Potrebbe andare bene per un gioco per giocatore singolo, anche se penso che molte persone preferirebbero un tempo di installazione più lungo (e un maggiore utilizzo dello spazio su disco) piuttosto che dover attendere costantemente il download di nuove risorse durante il gioco.
Anthony Grist,

2
Per una partita multiplayer? Disastro assoluto. Non vuoi tenere tutti gli altri giocatori in attesa di iniziare il gioco perché una persona deve scaricare alcune risorse che non hanno mai avuto bisogno fino ad ora.
Anthony Grist,

1
@AnthonyGrist Ecco perché molti giochi come league of legends richiedono che un giocatore abbia scaricato tutti gli asset di gioco prima di unirsi alla coda per trovare una partita. Questo funziona molto meglio che avere il ritardo del gioco mentre aspetti che una grande risorsa funzioni. Tieni presente che in questo genere di gioco, i giocatori si eccitano per una riduzione di 10 ms nel ping e spesso giocano con <50 ms di ping e possono dire se questo salta nell'intervallo 100-150. Aspettare di recuperare una risorsa durante una partita sarebbe un disastro in un MOBA o in un FPS, e se accadesse nel momento sbagliato potrebbe persino cambiare il risultato di una partita.
JustWannaFly,

@AnthonyGrist (continua) Immagino che potresti pensarci in questo modo. In alcuni giochi multiplayer / competitivi, i giocatori scambiano un tempo di caricamento / patch / installazione più lungo per un'esperienza di gioco più in tempo reale facendo in modo che un client si occupi di tutti gli aggiornamenti e l'inserimento della coda. Questo lo rende quindi solo il giocatore specifico che ha bisogno di risorse deve aspettare a meno che non voglia unirsi a una festa premade, quindi tutti i giocatori della squadra dovrebbero aspettare per entrare nella coda per trovare gli avversari
JustWannaFly

1

Un esempio di dove ciò non è stato fatto è stato Elder Scrolls Online, in cui si è fidato del cliente sull'altitudine del livello del suolo .

I minatori d'oro hanno lasciato cadere il livello del suolo di diversi metri. Potrebbero quindi camminare "sotto" il terreno e estrarre risorse dal basso senza essere visti dai PC o attaccati dagli NPC.

Modifiche simili hanno permesso loro di levigare le scogliere in modo da poterle risalire, rimuovere o instradare sotto muri statici, vedere attraverso tutti gli oggetti statici, ecc.

Fondamentalmente, il server si fidava del client riguardo alla posizione del giocatore, il calcolo della collisione sul lato server per ogni singolo giocatore contro tutte le statistiche sarebbe piuttosto pesante.

Nei giochi basati su tessere come Furcadia, tuttavia, è diverso: ogni quadrato in cui ci si sposta ha una pedonabilità sul lato server e il server non ha bisogno di fidarsi del client per nulla: il server conosce e convalida ogni movimento e azione dell'utente, e il client visualizza l'azione solo quando il server comunica il risultato.


1
TL; DR: presumi sempre che il cliente sia un bugiardo, un imbroglione, un ficcanaso . Ma la convalida del server di tutto riduce la tua capacità.
Draco18s,
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.