J'écris un serveur socket et un client de jeu flash. Le jeu nécessite des commandes en temps réel telles que le mouvement et le virage. Il est important que ces commandes soient envoyées par le serveur au client le plus rapidement possible car les autres clients désynchroniseraient beaucoup avec le client en déplacement/virage.Utilisation de TCP pour les commandes en temps réel: l'algorithme de Nagle provoque des retards énormes, que dois-je faire?
Voici un exemple du problème causé par l'arithmétique Nagle:
Remarque: voir le tableau de commande ci-dessous si vous souhaitez comprendre ce que ces commandes signifient.
Le premier est le navire je me suis déplacé (déplacé vers l'avant + droite, en avant a été reçu, mais droit de ne pas)
L'envoi de commandes clients:
84796: Sending data: 2#4
84796: Sending data: 2#2
84904: Sending data: 2#3
84904: Sending data: 2#0
86187: Sending data: 2#4
86188: Sending data: 2#2
86374: Sending data: 2#3
86404: Sending data: 2#0
Les commandes de réception de client:
79244: Raw receive: 3#3#4$
79244: New command: 3#3#4
79398: Raw receive: 3#3#2$3#3#3$3#3#0$
79399: New command: 3#3#2
79399: New command: 3#3#3
79399: New command: 3#3#0
80635: Raw receive: 3#3#4$
80635: New command: 3#3#4
80908: Raw receive: 3#3#2$3#3#3$3#3#0$
80908: New command: 3#3#2
80908: New command: 3#3#3
80908: New command: 3#3#0
« moment » est un terme étrange qui ne veut pas dire ce que je suis en train de dire, mais ici, il semble que le laps de temps en millisecondes après la commande précédente
aller de l'avant envoyer par le client A (moment: 0), reçu par le client B (instant: 0)
virage à droite envoyer par le client A (moment: 0), reçu par B (moment: 155) client
butée mobile envoyer par le client A (moment: 108), reçue par B client (moment: 0)
arrêt tournant envoyer par le client A (moment: 0), reçu par B client (moment: 0)
aller de l'avant envoyer par le client A (moment: 1283), reçu par B (moment: 1236) client
tourner à droite envoyer par le client A (moment: 1), reçu par B (moment: 273) client
stop mouvement envoi par le client A (moment: 186), reçu par le client B (instant: 0)
arrêt tournant envoyer par le client A (moment: 30), reçue par B client (moment: 0)
Voici le tableau de commande correspondant aux commandes:
client-> serveur
2# (movement info)
0) now not turning
1) now turning left
2) now turning right
3) now not moving
4) now moving forward
Server-> Client
3# (movement info)
[shipId]#
0) now not turning
1) now turning left
2) now turning right
3) now not moving
4) now moving forward
Alors, ce que vous pouvez voir est que les commandes sont totalement desynched à cause de "Nagle". Cela provoque la réception de la commande stop movement par les autres clients en même temps que la commande start movement, ce qui empêche le joueur de bouger du tout. C'est pourquoi j'ai besoin que ces commandes soient envoyées en temps réel, le plus rapidement possible par le serveur TCP. Une solution facile serait de désactiver simplement Nagle.Cependant, j'ai googled (notez que sa suggestion sur le message tcp partial est implémentée dans mon système mais n'a rien à voir avec le timing) et j'ai remarqué que les gens ne déconseillent absolument pas de désactiver Nagle.
Est-ce vrai que je ne devrais pas désactiver l'algorithme Nagle pour cette cause et que je devrais chercher une autre solution? Pourquoi pas)?
Merci d'avance. - Tom
Nagle * algorithme *, pas 'arithmétique'. – EJP