6

Mam obiekty serwera, które mają odpowiednie obiekty klienckie. Dane, które mają być synchronizowane, znajdują się wewnątrz słownika klucz/wartość obiektu serwera. Aby utrzymać synchronizację obiektów klienta z obiektami serwera, chcę, aby serwer wysyłał słownika klucz/wartość dla każdej klatki dla każdego obiektu.Jaka struktura danych/algorytm pozwoli mi wysyłać listę słowników klucz/wartość przy użyciu najmniejszej ilości bitów?

Jaka struktura danych/algorytm pozwoli mi wysyłać listę słowników klucz/wartość przy użyciu najmniejszej ilości bitów?

Ograniczenie bonusu 1: Dla każdego typu obiektu wartości niektórych klawiszy zmieniają się częściej niż w przypadku innych. Ograniczenie bonusu 2: Wykorzystanie pamięci po stronie serwera jest stosunkowo kosztowne.

+0

Czy należy przyjąć odpowiedź? (Zważywszy, że nadal odwiedzasz, oczywiście.) – corazza

Odpowiedz

4

Nie musisz wysyłać całego słownika. Zamiast tego wyślij tylko to, co zostało zmienione.

Nie trzeba wysyłać każdej klatki. Zamiast tego wysyłaj go w regularnych odstępach czasu, które nie mają nic wspólnego z liczbą klatek na sekundę.

Ważnym pomysł, aby pamiętać w drugim punktem jest to, że klienci mogą przewidzieć zmiany stanu gry - gra może trwać być symulowane w między otrzymywania informacji z serwera, a następnie musi tylko prawidłowego błędy po otrzymaniu autorytatywnych informacji z serwera ponownie.

0

Nie ma specjalnych struktur danych ani algorytmów. Przeniesienie ograniczonych danych jest wystarczające.

Przykładowe dane (jako ciąg C, zwróć uwagę na „\\”, który jest w rzeczywistości „\”): key1;value1;key2;value2;key3\\;with delimiter inside it;value3;\0

Można wybrać, które klawisze wysyłania, to jest łatwy do odczytu i zapisu * ** zajmuje niewiele pamięci i może nawet zostać skompresowany (ponieważ jest to tylko jeden strumień bajtów).

* -Read:

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

** - Zapis:

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