Sto lavorando a un motore di gioco multiplayer 2D client-server (che puoi provare qui ). Utilizza WebRTC DataChannel
. (Le connessioni sono peer-to-peer, ma il peer host funge ancora da server.)
Il problema più grande (a parte la connettività) è la previsione di input locale. Facciamo il solito: premendo i tasti, i giocatori si muovono all'istante, dicono all'host quali tasti vengono premuti, ricevono i dati dall'host e li confrontano con la posizione storica. La posizione viene corretta nel tempo in caso di differenza. Funziona bene con bassa perdita di pacchetti o PDV , anche se il ping è alto.
In caso di perdita o PDV, la deviazione può essere maggiore. Penso che ciò sia dovuto al fatto che se il primo pacchetto che indica un cambiamento di input viene ritardato o eliminato, l'host lo scopre più tardi e inizia a cambiare quel giocatore più tardi di quanto mostrato dalla loro previsione locale di input.
Se il giocatore si sta muovendo, aumentiamo la quantità di correzione applicata, poiché è meno evidente. Questo sembra coprire gli spazi vuoti quando si inizia a muoversi e durante lo spostamento. Tuttavia, qualsiasi correzione è più evidente se si arrestano bruscamente. Quindi se il PDV o la perdita significano che l'host pensa di essersi fermato più tardi, l'host esegue l'overhoot, restituisce i dati dicendo che sono un po 'più avanti e la correzione rende il giocatore alla deriva un po'. Su connessioni instabili, i giocatori spesso vanno alla deriva dopo essersi fermati.
Non l'ho notato in altri giochi. Come può essere mitigato?