Trappole del netcode: messaggi che spariscono in silenzio
I bug del multiplayer sono un genere a sé: niente va in crash, niente scrive un errore nel registro, semplicemente non succede niente. Due delle nostre trappole preferite del nostro codice di rete, come avvertimento e per divertimento.
Trappola 1: il messaggio non registrato. Il nostro protocollo di rete conosce delle classi di messaggi: «blocco cambiato», «giocatore spostato», «chat». Ogni nuovo tipo di messaggio va registrato nel codec, così ottiene un ID e può essere serializzato. Se te ne dimentichi, succede la cosa peggiore possibile: la chiamata di invio fallisce, ma in un punto dove l'errore viene inghiottito in silenzio. Nessun crash, nessun log: la funzione «semplicemente non funziona». Ci siamo imbattuti più volte nel debug, finché non è diventato un riflesso: nuova classe di messaggio? Prima domanda: è registrata?
Trappola 2: il blocco fantasma. Quando il server cambia un blocco, per esempio perché uno script rimodella il terreno, deve avvisare attivamente tutti i giocatori connessi. Se dimentichi il broadcast, ottieni un blocco fantasma: il server sa che lì c'è un blocco, il client mostra aria. Il giocatore sbatte contro un muro invisibile oppure, peggio, costruisce in un punto che sul server non esiste più. Solo ricaricando il chunk i due mondi tornano allineati.
Il denominatore comune: nel multiplayer ci sono sempre due verità, quella del server e quella del client, e ogni punto che deve tenerle sincronizzate è una potenziale trappola. La nostra risposta sono stati test che controllano proprio questa sincronizzazione e liste di controllo per i nuovi messaggi. Poco spettacolare, ma da allora i fantasmi sono diventati rari.
Commenti