Ich bin daran interessiert, die verschiedenen Möglichkeiten zu bewerten, wie sich der Netcode in eine Spiel-Engine "einhaken" kann. Ich entwerfe gerade ein Multiplayer-Spiel und habe bisher festgestellt, dass ich (zumindest) einen separaten Thread haben muss, um die Netzwerk-Sockets zu verwalten, der sich vom Rest der Engine unterscheidet, die die Grafikschleife und das Scripting verwaltet.
Ich hatte eine Möglichkeit, ein vernetztes Spiel vollständig mit einem Thread zu erstellen, nämlich das Netzwerk nach dem Rendern jedes Frames mit nicht blockierenden Sockets zu überprüfen. Dies ist jedoch eindeutig nicht optimal, da die Zeit, die zum Rendern eines Frames benötigt wird, zur Netzwerkverzögerung hinzugefügt wird: Nachrichten, die über das Netzwerk eingehen, müssen warten, bis das aktuelle Frame-Rendering (und die Spielelogik) abgeschlossen sind. Aber zumindest auf diese Weise würde das Gameplay mehr oder weniger reibungslos bleiben.
Ein separater Thread für das Netzwerk ermöglicht es dem Spiel, vollständig auf das Netzwerk zu reagieren. Beispielsweise kann es ein ACK-Paket sofort nach Erhalt einer Statusaktualisierung vom Server zurücksenden. Aber ich bin ein wenig verwirrt darüber, wie ich am besten zwischen dem Spielcode und dem Netzwerkcode kommunizieren kann. Der Netzwerkthread schiebt das empfangene Paket in eine Warteschlange, und der Spielthread liest zum richtigen Zeitpunkt während seiner Schleife aus der Warteschlange, sodass wir diese Verzögerung von bis zu einem Frame nicht beseitigt haben.
Es scheint auch so, als ob ich möchte, dass der Thread, der das Senden von Paketen behandelt, von dem Thread getrennt ist, der nach Paketen sucht, die über die Pipe kommen, da er keine senden kann, während er sich in der Mitte befindet Überprüfen, ob eingehende Nachrichten vorhanden sind. Ich denke über die Funktionalität von select
oder ähnlichem nach.
Ich denke meine Frage ist, wie man das Spiel am besten für die beste Netzwerkreaktivität gestaltet. Es ist klar, dass der Client Benutzereingaben so schnell wie möglich an den Server senden sollte, damit ich den Net-Send-Code unmittelbar nach der Ereignisverarbeitungsschleife innerhalb der Spielschleife erhalten kann. Ist das sinnvoll?