Pułapki netcode’u: wiadomości, które po cichu znikają
Błędy w multiplayerze to osobny gatunek: nic się nie wywala, nic nie loguje błędu – po prostu nic się nie dzieje. Dwie z naszych ulubionych pułapek z własnego kodu sieciowego, ku przestrodze i dla rozrywki.
Pułapka 1: niezarejestrowana wiadomość. Nasz protokół sieciowy zna klasy wiadomości – „blok zmieniony”, „gracz się poruszył”, „czat”. Każdy nowy typ wiadomości trzeba zarejestrować w kodeku, żeby dostał ID i dało się go serializować. Zapomnij o tym, a stanie się najgorsze: wysyłanie się nie udaje, ale w miejscu, gdzie błąd jest po cichu połykany. Żadnego crasha, żadnego logu – funkcja „po prostu nie działa”. Debugowaliśmy to więcej niż raz, aż odruch się utrwalił: nowa klasa wiadomości? Pierwsze pytanie: czy jest zarejestrowana?
Pułapka 2: blok-duch. Kiedy serwer zmienia blok – na przykład dlatego, że jakiś skrypt przekształca teren – musi aktywnie powiadomić wszystkich podłączonych graczy. Zapomnij o rozgłoszeniu, a dostaniesz blok-ducha: serwer wie, że tam jest blok, a klient pokazuje powietrze. Gracz wpada na niewidzialną ścianę – albo, co gorsza, buduje w miejscu, które po stronie serwera już nie istnieje. Dopiero ponowne załadowanie chunka znów zgrywa oba światy.
Wspólny mianownik: w multiplayerze zawsze są dwie prawdy – serwera i klienta – a każde miejsce, które musi je synchronizować, to potencjalna pułapka. Naszą odpowiedzią były testy sprawdzające dokładnie tę synchronizację oraz listy kontrolne dla nowych wiadomości. Mało spektakularne, ale duchy od tamtej pory zdarzają się rzadko.
Komentarze