L'ho fatto per un gioco di corse PSP commerciale, che funzionava sia su una rete ad hoc, sia tramite un hotspot wireless. (O a un server statico su Internet, se lo si desidera)
A causa del punto 2, il sistema non deve essere complesso per quanto riguarda l'ottimizzazione
Nella mia esperienza, questo non è vero. I dispositivi wireless (specialmente quelli portatili di piccole dimensioni) non sono come i computer con connessioni di rete cablate: gli smartphone e le console di gioco wireless tendono ad avere interfacce di rete lente per scopi di gioco.
Non fraintendetemi: il loro throughput è generalmente buono (vale a dire, la quantità di dati al secondo; ottimo per lo streaming di film o ecc.), Ma la latenza alla consegna di un determinato pacchetto può essere estremamente negativa e può essere così altamente variabile che è difficile persino stimare quanto tempo impiegherà ogni singolo pacchetto a consegnare. Questa variazione peggiora ulteriormente quando più dispositivi wireless sono raggruppati in un'area generale, poiché i loro segnali iniziano a interferire tra loro. Di conseguenza, molto del mio tempo è stato impiegato per ridurre il numero di pacchetti che dovevano essere inviati, quindi avremmo meno collisioni di pacchetti. (Si noti che questo è un po 'meno un problema nel caso in cui sia coinvolto un hotspot di rete alimentato, piuttosto che avere i dispositivi che comunicano tra loro direttamente su una rete ad hoc)
Come esempio di questo tipo di ottimizzazione, il nostro gioco di corse si è svolto in un mondo con semafori. Migliaia di loro. E dovevamo assicurarci che i loro segnali fossero sincronizzati tra tutti i giocatori in una sessione di rete. Invece di provare a inviare pacchetti in giro per dire a tutti quali luci si trovavano in quale stato, abbiamo definito un programma statico per tutti i semafori e quindi ci siamo assicurati che tutti i clienti fossero d'accordo sull'attuale "tempo di gioco". Dato che sapevano tutti il tempo di gioco e tutti gli stati dei semafori potevano essere determinati dal tempo di gioco, abbiamo sincronizzato tutti i dati di stato senza effettivamente inviare alcun dato speciale. Questa modifica ha fatto una grande differenza per le nostre prestazioni di rete.
Ciò detto, stabilire una sincronizzazione dell'orologio affidabile tra più dispositivi wireless (con tempi di ping molto variabili a causa in gran parte della perdita di pacchetti) è stata una grande sfida. Felice di parlarne di più se hai un interesse.
Ogni cliente può essere una fonte autorevole di dati su se stesso e il suo ambiente immediato (ad esempio i punti elenco).
Questo è quello che abbiamo fatto e ha funzionato bene per noi nella nostra situazione (macchine). La parte problematica, ovviamente, è quando un oggetto smette di essere più vicino al giocatore 'a' che al giocatore 'b', e quindi la sua proprietà si trasferisce da un giocatore all'altro.
Questa è in realtà una negoziazione sorprendentemente complessa tra i giocatori, in cui il gioco 'a' propone di giocare 'b': "Penso che questo oggetto sia più vicino a te. Dovresti prenderne il controllo." E poi il gioco 'b' può accettare o può declinare in base alla propria visione della situazione. Le differenze nello stato di gioco percepito tra 'a' e 'b', e il cambiamento nel tempo tra quando la richiesta e la risposta sono inviate e ricevute rende questa trattativa particolarmente cattiva per diventare affidabile, e può facilmente degenerare in un gioco di "patata bollente", con la proprietà dell'oggetto che rimbalza continuamente tra più giocatori. E anche quando funziona correttamente, se visto dal punto di vista del gioco 'c', lì '
La mia intuizione è che questo tipo di approccio alla "proprietà dell'oggetto" è probabilmente troppo ingombrante per oggetti piccoli e di breve durata come proiettili. Lo abbiamo usato per le macchine del traffico e per i corridori di intelligenza artificiale, che tendevano a vivere nella simulazione per un tempo relativamente lungo. Sembra un approccio più performante, se sei disposto a fidarti dei clienti, sarebbe quello di far sì che il gioco di ogni giocatore possieda la propria posizione e i propri proiettili e dichiarare quando quel giocatore è stato colpito dal proiettile di qualcun altro. (Così come "gioco A", sono responsabile di dire dove sono i proiettili del giocatore A e del giocatore A, ma il giocatore B è responsabile di dire se ho colpito il giocatore B). Con una buona resa dei conti, dovresti essere in grado di ottenere un comportamento abbastanza ragionevole da un sistema come questo.