Je suis intéressé à évaluer les différentes façons dont le netcode peut "se connecter" à un moteur de jeu. Je suis en train de concevoir un jeu multijoueur maintenant, et jusqu'à présent, j'ai déterminé que je dois (au moins) avoir un thread séparé pour gérer les sockets réseau, distinct du reste du moteur qui gère la boucle graphique et les scripts.
J'avais un moyen potentiel de créer un jeu en réseau entièrement monothread, qui consiste à le faire vérifier le réseau après le rendu de chaque image, en utilisant des sockets non bloquants. Cependant, ce n'est clairement pas optimal car le temps nécessaire pour rendre une trame est ajouté au décalage du réseau: les messages arrivant sur le réseau doivent attendre la fin du rendu de la trame actuelle (et de la logique du jeu). Mais, au moins de cette façon, le gameplay resterait plus ou moins fluide.
Le fait d'avoir un thread séparé pour la mise en réseau permet au jeu d'être complètement réactif au réseau, par exemple, il peut renvoyer un paquet ACK instantanément à la réception d'une mise à jour d'état du serveur. Mais je suis un peu confus quant à la meilleure façon de communiquer entre le code du jeu et le code réseau. Le thread de mise en réseau poussera le paquet reçu dans une file d'attente, et le thread de jeu lira à partir de la file d'attente au moment approprié au cours de sa boucle, nous ne nous sommes donc pas débarrassés de ce délai d'une trame.
En outre, il semble que je souhaiterais que le thread qui gère l'envoi de paquets soit distinct de celui qui vérifie les paquets qui descendent, car il ne pourrait pas en envoyer un lorsqu'il est au milieu de vérifier s'il y a des messages entrants. Je pense à la fonctionnalité de select
ou similaire.
Je suppose que ma question est, quelle est la meilleure façon de concevoir le jeu pour la meilleure réactivité du réseau? De toute évidence, le client doit envoyer l'entrée utilisateur dès que possible au serveur, afin que je puisse faire venir le code net-send immédiatement après la boucle de traitement des événements, à la fois à l'intérieur de la boucle de jeu. Est-ce que cela a un sens?