Hai solo bisogno di circa 30 aggiornamenti (o anche meno forse 10 o 20) al secondo. interpolare le posizioni degli oggetti in movimento sul lato client. In generale, è necessario inviare i dati solo quando sono REALMENTE necessari. In WoW potresti ricevere più aggiornamenti dai giocatori con cui sei in un gruppo che dai giocatori che si trovano nella stessa posizione. Inoltre, se un altro giocatore è lontano da te, non ricevi più aggiornamenti al secondo su di lui.
Quindi, invia solo un'istantanea completa a ciascun giocatore quando si connette. Successivamente invia solo le modifiche agli oggetti di gioco. Se non si è verificato alcun cambiamento, non inviarlo.
Quindi, fai un uso intensivo di BitVector o di come potresti chiamarli per ridurre la quantità di dati non necessari! Esempio: puoi anche provare a scrivere un float usando solo un byte (in un intervallo da 0 a 1 o da -1 a 1) in modo da avere solo 256 o 128 valori diversi. Ma il giocatore non noterà alcun movimento a scatti grazie alle interpolazioni.
Guarda questo per un esempio con LidgrenLibrary su come comprimere i dati: http://code.google.com/p/lidgren-network-gen3/wiki/Optimization
Successivo: prova a ridurre il raggio di visione dei giocatori mentre si muovono e trasmetti solo informazioni importanti in quel momento. Quindi, quando si fermano, aumenta di nuovo il loro raggio visivo. È possibile utilizzare un sistema di hashing spaziale o un albero bsp per ridurre il sovraccarico di cercare oggetti "nel raggio di azione". Questa è una buona lettura per l'argomento: http://en.wikipedia.org/wiki/Collision_detection
Comprime anche i dati TE solo tu conosci la struttura dei dati e la coerenza temporale nei dati (che può e deve essere sfruttata). Un algoritmo generale come Bzip2, Deflate, qualunque cosa, dovrebbe essere usato, ma solo come fase finale di compressione!
Inoltre, per informazioni non critiche per il gioco, potresti anche utilizzare tecniche P2P aggiuntive. Esempio: un giocatore gioca l'animazione "ciao" (solo un effetto grafico) Il giocatore invia queste informazioni al server, ma il server non trasmette le informazioni agli altri giocatori. Invece questo effetto non critico viene inviato dal giocatore stesso agli altri client nel raggio di azione.
MODIFICA (a causa del commento):
Metodi aggiuntivi per ridurre il numero medio di bit al secondo per ciascun giocatore:
Hai scritto che hai inviato "L'oggetto non è cambiato". Non c'è motivo di farlo. Se ti preoccupi della perdita di pacchetti (e non sincronizzi la tua simulazione per questo motivo) considera quanto segue: Ad ogni timestep fisso (es. 100, 200, 300, 400 ...) esegui lo hash dello stato di simulazione e invialo al server . il server conferma o invia indietro un'istantanea completa di tutti i dati.
Per cose come i razzi o anche i giocatori, puoi impiegare non solo l'interpolazione ma anche l'estrapolazione per rendere la simulazione più realistica. Esempio "Razzo": invece di aggiornare con messaggi come "È ora in posizione x" basta inviare un messaggio una volta contenente quanto segue: "Razzo generato: posizione (vettore), Tempo (in corrispondenza del quale è stato generato il razzo), velocità ( vettore)". Quindi non devi nemmeno includere la rotazione perché la punta sarà sempre nella direzione della "velocità".
Combina più comandi in un messaggio e non inviare mai messaggi più piccoli di 16-20 byte perché l'intestazione udp sarà più grande del messaggio stesso. Inoltre, non inviare pacchetti più grandi dell'MTU del protocollo perché la frammentazione rallenterà la velocità della trasmissione.