Protokół Sieciowy i Synchronizacja
Architektura sieciowa opiera się na bezpołączeniowym protokole UDP. Serwer pełni rolę matchmakera, zarządcy sesji oraz przekaźnika (relay) dla pakietów wymiany ruchu.
1. Zunifikowany Pakiet Sieciowy (NetworkPacket)
Zamiast budować rozbudowane, obciążające warstwy serializacji (np. JSON czy XML przez sieć), cała komunikacja opiera się na przesyłaniu fizycznej struktury C++ (unii). Zapewnia to maksymalną wydajność i błyskawiczne parsowanie.
struct NetworkPacket {
PacketHeader header;
union Payload {
PlayerData gameData; // Koordynaty i stan gracza
struct {
int count;
SessionInfo sessions[10];
} sessionList; // Lista dostępnych pokoi
struct {
unsigned int seed; // Ziarno generatora mapy
} mapData;
} payload;
};
Dostępne typy pakietów (PacketType) to:
REQ_SESSIONSRES_SESSIONSCREATE_SESSIONJOIN_SESSIONGAME_DATASYNC_MAP
2. Synchronizacja Proceduralnej Mapy (Seed)
Zamiast zapychać łącze przesyłaniem koordynatów setek obiektów, platform i przedmiotów, serwer gwarantuje identyczność poziomów poprzez synchronizację ziarna generatora liczb losowych (Seed).
-
Gdy klient tworzy nową sesję (
CREATE_SESSION), serwer losuje dla niej unikalny kluczseed. -
Serwer rozsyła ten klucz do założyciela oraz każdego dołączającego gracza (w pakiecie
SYNC_MAP). -
Po odebraniu pakietu
SYNC_MAP, lokalny klient przekazuje otrzymany seed do klasyLevelGenerator. Ponieważ algorytm proceduralny jest deterministyczny, wygeneruje on co do milimetra identyczny układ platform i przedmiotów u wszystkich graczy w pokoju.
3. Architektura Serwera i Zarządzanie Sesjami
Serwer utrzymuje logikę „Bicia serca” (Heartbeat).
-
Timeout — Serwer zapisuje czas ostatniego odebranego pakietu od każdego gracza. Jeśli klient nie wyśle żadnego pakietu przez ponad 5 sekund, zostaje automatycznie usunięty z sesji.
-
Utrata Hosta — Jeśli rozłączy się założyciel (host — indeks
0w wektorze graczy), serwer automatycznie zamyka i niszczy całą sesję, wyrzucając pozostałych uczestników.
4. Interpolacja na Kliencie (Wygładzanie)
Z uwagi na naturę protokołu UDP (pakiety mogą docierać w różnej kolejności lub ginąć), pola targetX, targetY, targetZ oraz kąty obrotu asynchronicznie przyjmują pakiety od innych graczy.
Główna pętla gry następnie w każdej klatce gładko przesuwa wyrenderowane modele przeciwników za pomocą funkcji mieszania liniowego (lerp), z włączonym współczynnikiem delta time. Eliminuje to efekt „teleportowania się” postaci.