Chcę stworzyć prostą grę wieloosobową klient-serwer w czasie rzeczywistym jako projekt dla mojej klasy sieciowej.
Dużo czytałem o modelach sieciowych dla wielu graczy w czasie rzeczywistym i rozumiem relacje między klientem a serwerem oraz techniki kompensacji opóźnień.
To, co chcę zrobić, to coś podobnego do modelu sieciowego Quake 3: w zasadzie serwer przechowuje migawkę całego stanu gry; po otrzymaniu danych wejściowych od klientów serwer tworzy nową migawkę odzwierciedlającą zmiany. Następnie oblicza różnice między nową migawką a ostatnią i wysyła je do klientów, aby mogli być zsynchronizowani.
To podejście wydaje mi się naprawdę solidne - jeśli klient i serwer mają stabilne połączenie, tylko minimalna niezbędna ilość danych zostanie wysłana, aby je zsynchronizować. Jeśli klient nie jest zsynchronizowany, można również zażądać pełnej migawki.
Nie mogę jednak znaleźć dobrego sposobu na wdrożenie systemu migawek. Bardzo trudno mi odejść od architektury programowania dla jednego gracza i zastanowić się, jak mogę zapisać stan gry w taki sposób, aby:
- Wszystkie dane są oddzielone od logiki
- Różnice można obliczyć między migawkami stanów gry
- Elementami gry można nadal łatwo manipulować za pomocą kodu
Jak wdrażana jest klasa migawki ? Jak przechowywane są podmioty i ich dane? Czy każda jednostka klienta ma identyfikator pasujący do identyfikatora na serwerze?
Jak obliczane są różnice w migawkach?
Ogólnie: w jaki sposób zostałby wdrożony system migawek stanu gry?