6

Ho oggetti server con oggetti client corrispondenti. I dati da tenere sincronizzati si trovano nel dizionario chiave/valore dell'oggetto server. Per mantenere gli oggetti client in sincronia con gli oggetti sever, voglio che il server invii il dizionario chiave/valore ogni frame per ogni oggetto.Quale struttura/algoritmo dati mi consentirà di inviare un elenco di dizionari chiave/valore utilizzando la minor quantità di bit?

Quale struttura dati/algoritmo mi consentirà di inviare un elenco di dizionari chiave/valore utilizzando la minor quantità di bit?

Vincolo bonus 1: per ogni tipo di oggetto, i valori di alcuni tasti cambiano più spesso di altri. Vincolo bonus 2: l'utilizzo della memoria sul lato server è relativamente costoso.

+0

La prego quindi di accettare una risposta? (Visto che visiti ancora, ovviamente.) – corazza

risposta

4

Non è necessario inviare l'intero dizionario. Invece, invia solo ciò che è cambiato.

Non è necessario inviarlo ogni frame. Invece, inviarlo a intervalli regolari che non hanno nulla a che fare con il frame rate.

Un'idea importante da tenere a mente nel secondo punto è che i clienti possono prevedere cambiamenti nello stato di gioco - il gioco può andare avanti da simulare in mezzo ricevere informazioni dal server, e quindi deve solo corretta gli errori dopo aver ricevuto di nuovo informazioni autorevoli dal server.

0

Non ci sono strutture dati speciali o algoritmi. Il trasferimento di dati delimitati è sufficiente.

dati di esempio (come una stringa C, si noti il ​​"\\", che è in realtà un "\"): key1;value1;key2;value2;key3\\;with delimiter inside it;value3;\0

È possibile scegliere quali tasti si invia, è facile da leggere e scrivere * **, richiede poca memoria e può anche essere compresso (dato che è solo un flusso di byte).

* -Leggi:

while(peekbyte() != 0) 
{ 
    key = readuntil(';'); // checks if previous byte isn't "\" while looking for char. 
    value = readuntil(';'); 
    add(key, value); 
} 

** - Write:

foreach(key in keylist) 
{ 
    write(replace(';', '\\;', key)); 
    write(replace(';', '\\;', dict[ key ])); 
} 
write('\0'); 
Problemi correlati