Ich arbeite an einer 2D-Server-Client-Multiplayer-Game-Engine (die Sie hier ausprobieren können ). Es verwendet WebRTCs DataChannel
. (Die Verbindungen sind Peer-to-Peer-Verbindungen, der Host-Peer fungiert jedoch weiterhin als Server.)
Das größte Problem (abgesehen von der Konnektivität) ist die lokale Eingabevorhersage. Wir machen das Übliche: Beim Drücken einer Taste bewegen sich die Spieler sofort, teilen dem Host mit, welche Tasten gedrückt werden, empfangen Daten vom Host und vergleichen sie mit der historischen Position. Die Position wird im Laufe der Zeit korrigiert, wenn ein Unterschied besteht. Dies funktioniert gut mit geringem Paketverlust oder PDV , auch wenn der Ping hoch ist.
Bei Verlust oder PDV kann die Abweichung größer sein. Ich denke, das liegt daran, dass der Host es später herausfindet, wenn das erste Paket, das eine Änderung der Eingabe anzeigt, verzögert oder verworfen wird, und beginnt, diesen Player später zu ändern, als es die lokale Eingabevorschrift anzeigt.
Wenn sich der Spieler bewegt, erhöhen wir den Umfang der angewendeten Korrektur, da dies weniger auffällt. Dies scheint Lücken zu schließen, wenn Sie anfangen, sich zu bewegen, und während Sie sich bewegen. Jede Korrektur ist jedoch deutlicher, wenn sie abrupt zum Stillstand kommt. Dann, wenn der PDV oder Verlust bedeutet, dass der Host denkt, dass er später aufgehört hat, überschießt der Host das Signal, sendet Daten zurück und sagt, dass sie etwas weiter vorne liegen, und die Korrektur lässt den Spieler ein wenig driften. Bei schuppigen Verbindungen driften die Spieler oft merklich, nachdem sie zum Stillstand gekommen sind.
Ich habe das in anderen Spielen nicht bemerkt. Wie kann dies gemildert werden?