Come si consente di scrivere il codice di rete nelle fasi successive dello sviluppo?


12

Attualmente sto scrivendo un gioco che alla fine vorrò migliorare in molti aspetti.
Come posso saltare scrivendo il codice di rete ma lasciandolo abbastanza facilmente implementato, cioè non dover riscrivere l'intero gioco solo per aggiungerlo.
Cosa devo tenere a mente?

Ho un modello di componenti in cui separo fisica / rilevazione delle collisioni, logica di gioco, tipi di dati e animazione / rendering l'uno dall'altro.
Come faccio a scrivere un client e un server che non hanno ancora implementato alcun codice di rete che può essere testato localmente?
Cosa devo fare nel client e cosa devo fare nel server? Dovrei solo fingere di avere finito il codice di rete e inviare messaggi tra server e client e tenere conto di ritardi, ecc., Anche se non ce ne saranno?

Modifica: è previsto un gioco di ruolo top down. Il multiplayer semplice in cui si ospita un server per i tuoi amici è quello che sto pensando, quindi imbrogliare non è un grosso problema (chi vorrebbe giocare con gli amici imbroglioni?). Mi piacerebbe comunque andare con un approccio "Il server ha sempre ragione".

Modifica 2: Immagino che sto cercando alcuni suggerimenti su come dovrebbe essere la mia mentalità. Come devo gestire l'input da tastiera, l'animazione, ecc., Invece di applicare immediatamente ogni effetto / modifica. Hmmm, potrei aver bisogno di leggere correttamente sulla rete prima di andare ovunque, dopotutto, che era quello che avevo sperato di scappare facendo uno scheletro di rete di qualche tipo che potesse funzionare localmente.


Ciò dipende molto da come prevedi di implementare il tuo codice di rete una volta arrivato lì. Quake (o qualche titolo id successivo, forse, la mia memoria è leggermente sfocata), ad esempio, ha adottato l'approccio di essere sempre client / server. Anche l'opzione single player si sta effettivamente connettendo a un server su 127.0.0.1 e non sta invitando altri giocatori, il che significa che anche il gioco single player funziona interamente tramite il codice di rete.
LLL79,

È una specie di cosa avevo in mente. Forse alcune comunicazioni tra processi in modo da non doverti connettere quando vuoi giocare da solo o forse una classe che ha le stesse funzioni del client ma lo gestisce come il server immediatamente.
Ghork,

3
La migliore pratica è stata "non" per un bel po 'di tempo. A meno che tu non stia scrivendo un gioco a turni, devi semplicemente progettare le cose in modo diverso per gestire la rete. Se ti preoccupi di latenza, correttezza e imbrogli, semplicemente non c'è modo di aggirarlo. Se non lo fai, non hai davvero bisogno di pensarci tanto - se non hai l'esperienza, non predirrai comunque il design corretto abbastanza bene. Il modo migliore è iniziare con un paio di prototipi collegati in rete per acquisire esperienza di networking, davvero.
Luaan,

Se ci pensate, Minecraft ha un server locale anche nelle partite a giocatore singolo. Il server è il motore, il client è solo un presentatore.
SparK,

Risposte:


12

Senza sapere di più sul gioco esatto che stai scrivendo e su come lo stai scrivendo, è molto difficile dire soluzioni generiche al tuo problema.

Tuttavia, potresti prendere in considerazione questa decisione che stai prendendo di lasciare il codice di rete fino alla fine, a seconda di quanto sia cruciale la rete per il tuo gioco.

Quello che voglio dire è che, se stai scrivendo un gioco pesante di rete, come un MMORPG, potrebbe non essere saggio lasciare la rete fino alla fine.

Ciò considerato, se l'impatto previsto per il codice di rete è basso (come in, non avere affatto il codice di rete non è un gioco da ragazzi), allora potrebbe essere opportuno lasciarlo per una fase successiva (ma non troppo tardi).

Ricorda che scrivere-codice di rete non è lo stesso di -pensarci- a riguardo. Quando prendi decisioni su come viene fatto il tuo gioco, dovresti considerare in che modo ciò influirebbe sulle decisioni di rete e, se l'impatto previsto è elevato, potresti implementarlo come uno stub che fornisce alcune informazioni generiche e quindi quando è il momento di scrivere la rete codice, è solo una questione di collegarlo dove hai lasciato lo stub.

Quindi, ad esempio, se stai facendo una partita a scacchi online, potresti avere una funzione chiamata ExecuteMove()che viene chiamata in qualche modo quando una mossa viene immessa dal mouse e in un altro modo quando una mossa viene immessa dalla tastiera. A questo punto, potresti voler pensare di creare uno stub di rete che, dopo aver ottenuto i dati richiesti dall'altro host (questo è ciò che scrivi in ​​una parte successiva), chiama ExecuteMove().

In questo modo, mentre crei il tuo gioco, saprai quali parti sono interessate dal codice di rete e quando è il momento di scrivere effettivamente il codice di rete, sei diversi passi avanti.

Se è la prima volta che scrivi un gioco in rete, considera di non pensare troppo agli anti-cheat e cose del genere. Realizzare un gioco in rete è abbastanza complesso da richiedere a un intero team di persone di grande esperienza di farlo per un gioco AAA, quindi procedi lentamente e prima crea un gioco che funzioni, prima di concentrarti su argomenti più complessi.

Infine, se è la prima volta che giochi, non farlo in rete, per favore. Creare un gioco è così complesso che ogni requisito aggiunto al tuo gioco lo renderà esponenzialmente più complesso.


Bene, non è MMO, quindi non sarà così pesante sulla rete. Tuttavia, non è un gioco da tavolo stantio in cui è bene prendere qualche secondo prima che venga effettuata una mossa. Sento che la rete dovrebbe essere pensata all'inizio perché, nella mia esperienza, l'aggiunta del multiplayer nelle ultime fasi non funzionerà. Tuttavia non voglio scrivere codice di rete e debug prima di poter far muovere il mio personaggio e scontrarmi con oggetti.
Ghork,

2
@Ghork: Ah, vuoi vedere il tuo prodotto fare cose carine il prima possibile! Bene, sì, lo facciamo tutti. Ma soccombere a quella tentazione non porterà a un programma ben progettato e ben congegnato.
Corse della leggerezza in orbita,

Accetterò questa risposta, anche se mi piacciono anche le altre risposte. In particolare il commento di @Luaan
Ghork il

2

Sono in una situazione simile, ma sto provando a fare una simulazione in rete più di un gioco; ma penso che il mio approccio possa aiutare il tuo processo di progettazione.

Il mio approccio è in linea con il tuo commento su IPC (comunicazione tra processi).

In primo luogo, come sfondo sto studiando il libro "Networked Graphics" di Steed e Oliveira. Ciò fornisce un buon background su varie architetture di rete per i giochi a seconda di vari criteri e tipi di gioco. Fornisce uno strumento per aiutarti a decidere la tua architettura di gioco e cosa vuoi mettere esattamente sulla rete e cosa vuoi che avvenga localmente.

In secondo luogo, separa i componenti di rete in un thread in background separato in modo che lo sviluppo iniziale del gioco possa avere il componente codificato localmente, ma sei costretto a gestire la separazione dei thread. Non combinarli con altre funzionalità che saranno in seguito "sfondo locale", ma forzali in thread di sfondo "potenzialmente remoti".

Ciò dovrebbe aiutare a mantenere la logica separata e consentire anche di simulare i fattori di ritardo della rete nel processo in modo da poter vedere anche l'impatto della latenza.


Immagino che dovrò controllare quel libro allora! Sembra promettente poter fare ciò che hai detto.
Ghork,

@Ghork: la chiave è capire la tua architettura, cosa vuoi localmente e cosa vuoi su un server; o come desideri che i colleghi comunichino e interagiscano. Quel libro dovrebbe aiutare. Quindi inserisci tutto ciò che vuoi remoto dall'altra parte di una chiamata di messaggio IPC attraverso un set di codice client-server che (per ora) tutto rimane locale ma mantiene roba "remota" su thread separati. Nel componente di passaggio messaggi IPC, aggiungere artificialmente qualsiasi latenza che si desidera simulare. In bocca al lupo!
Joe Van Steen,

1

Se stai imparando tutte queste cose, perché non scrivere una semplice versione 1 per giocatore singolo, e una volta che funziona, con le tue conoscenze più profonde, ripensare il tutto in modo approfondito per la versione 2 che sarà multigiocatore?


0

Implementa una classe "rete falsa" che passa i messaggi tra i thread, che ha la stessa interfaccia della classe di rete. Successivamente è possibile elaborare la rete falsa per avere ritardi casuali e perdita di pacchetti. Sarà sempre più facile eseguire il debug del codice di rete con la classe fake che con la rete reale.

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.