Comment puis-je obtenir le temps de latence entre le serveur et le client en C#?
Je suis en train de travailler sur un C# Serveur d'application pour un moteur de jeu, je suis en train d'écrire en ActionScript 3. Je suis sur un serveur faisant autorité comme modèle pour empêcher la tricherie et assurer un jeu équitable. Jusqu'à présent, tout fonctionne bien:
Lorsque le client commence à se déplacer, il indique au serveur et commence rendu localement; le serveur, puis, dit tout le monde que le client X a commencé à se déplacer, parmi les détails afin qu'ils puissent également commencer le rendu. Lorsque le client arrête de bouger, il indique au serveur, qui effectue des calculs basés à la fois que le client a commencé à se déplacer et le client de rendu tique retard, et les réponses de tout le monde, de sorte qu'ils peuvent mettre à jour avec les valeurs correctes.
Le truc, c'est que lorsque j'utilise la valeur par défaut de 20ms tique de retard sur les calculs du serveur, lorsque le client se déplace pour une assez longue distance, il y a une notable s'incliner vers l'avant quand il s'arrête. Si j'augmente légèrement le retard de 22ms, sur mon réseau local tout fonctionne très bien, mais dans d'autres endroits, l'inclinaison est toujours là. Après avoir expérimenté un peu, j'ai remarqué que le délai supplémentaire nécessaire est assez liée à la latence entre le client et le serveur. J'ai même bouilli vers le bas pour une formule qui fonctionne très bien: délai = 20 + (temps de latence /10).
Alors, comment pourrais-je procéder pour obtenir le temps de latence entre le client et le serveur (je suis à l'aide de sockets asynchrones). Le PROCESSEUR de l'effort ne peut pas être de trop, de ne pas avoir le serveur d'exécuter lentement. Aussi, est-ce vraiment la meilleure façon, ou est-il plus efficace/moyen plus facile de faire cela?
OriginalL'auteur DfKimera | 2009-04-21
Vous devez vous connecter pour publier un commentaire.
Désolé que ce n'est pas répondre directement à votre question, mais de manière générale, vous ne devriez pas s'appuyer trop fortement sur la mesure de la latence, car il peut être très variable. Non seulement cela, vous ne savez pas si le ping fois que vous mesurez est encore symétrique, ce qui est important. Il n'y a pas de point d'application de 10ms de latence de correction si il s'avère que le temps de réponse de 20 ms est en fait 19ms à partir du serveur vers le client et 1ms du client vers le serveur. Et la latence de l'application des termes n'est pas la même que dans les réseaux termes, vous pourriez être en mesure de pinger une machine et obtenir une réponse dans les 20ms, mais si vous êtes communiquant avec un serveur sur la machine qui traite uniquement de réseau d'entrée de 50 fois par seconde, alors que vos réponses pourront être retardées par un supplément de 0 à 20 ms, et cela varie plutôt de façon imprévisible.
Qui ne veut pas dire que la latence de la mesure, il n'ont pas leur place dans le lissage des prédictions, mais il ne va pas résoudre votre problème, il suffit de le nettoyer un peu.
Sur le visage de celui-ci, le problème semble être ici que de vous envoyer des informations dans le premier message que vous pouvez utiliser pour extrapoler les données à partir jusqu'à ce que le dernier message est reçu. Si tout le reste reste constante alors le vecteur de mouvement donné dans le premier message multiplié par le temps entre les messages donnera le serveur de la bonne position que le client n'a à peu près maintenant-(temps de latence/2). Mais si le temps de latence des changements à tous, le temps entre les messages d'augmenter ou de réduire. Le client peut savoir qu'il est déplacé de 10 unités, mais le serveur simulé lui déplacement de 9 ou 11 unités avant d'être dit pour accrocher à lui, à 10 unités.
La solution générale de cette est de ne pas supposer que le temps de latence va rester constante, mais pour envoyer périodique de la position des mises à jour qui permettent au serveur de vérifier et de corriger la position du client. Avec seulement 2 messages que vous avez maintenant, tout l'erreur est trouvée et corrigée après la 2ème message. Avec de plus en plus de messages, l'erreur est répartie sur de nombreux autres exemples de points permettant pour plus de douceur et moins visibles de correction.
Il ne peut jamais être parfait, mais: il suffit d'un pic de latence dans la dernière milliseconde de mouvement et le serveur de représentation de la volonté de dépassement. Vous ne pouvez pas obtenir autour de cette si vous êtes à la prédiction de l'avenir du mouvement basée sur des événements passés, qu'il n'y a pas de véritable alternative à choisir soit correcte-mais-tardive ou erronée-mais-en temps opportun étant donné que l'information prend le temps de voyager. (Blâme Einstein.)
OriginalL'auteur Kylotan
Une chose à garder à l'esprit lors de l'utilisation de ICMP en fonction les pings est que de l'équipement de réseau se donnent souvent le trafic ICMP de priorité inférieure à la normal paquets, en particulier lorsque les paquets de traverser les frontières du réseau tels que les liaisons WAN. Cela peut conduire à des pings être supprimé ou montrant une latence plus élevée que le trafic connaît et se prête à être un indicateur de problèmes plutôt que d'un outil de mesure.
L'utilisation croissante de La qualité de Service (QoS) dans les réseaux ne fait qu'aggraver ce et, en conséquence, si le ping reste encore un outil utile, il doit être entendu qu'il ne peut pas être un reflet fidèle de la latence du réseau pour les non-ICMP en fonction réel trafic.
Il y a un bon poste à la Itrinegy blog Comment mesurez-vous le temps de Latence (RTT) dans un réseau de ces jours? à ce sujet.
OriginalL'auteur Sim
Vous pouvez utiliser le déjà disponible Ping Classe. Doit être préférée à la rédaction de votre propre à mon humble avis.
OriginalL'auteur leen
Avoir une commande "ping", où vous envoyez un message depuis le serveur vers le client, puis le temps combien de temps il faut pour obtenir une réponse. De limitation de surcharge du PROCESSEUR scénarios, il devrait être assez fiable. Pour obtenir un voyage de temps, il suffit de diviser le temps par 2.
OriginalL'auteur Adam Robinson
Nous pouvons mesurer la aller-retour de temps à l'aide de la
Ping
classe de l' .NET Framework.Instancier un
Ping
et abonnez-vous à laPingCompleted
événement:Ajouter du code pour configurer et de l'action de la commande ping.
Notre
PingCompleted
gestionnaire d'événements (PingCompletedEventHandler
) a unPingCompletedEventArgs
argument. LePingCompletedEventArgs.Répondre
nous permet d'obtenir unPingReply
objet.PingReply.RoundtripTime
retourne le round trip time (le "nombre de millisecondes prises pour envoyer un Internet Control Message Protocol (ICMP) de demande d'écho et de recevoir la réponse d'écho ICMP message"):Code dump de travail exemple, sur la base MSDN exemple. J'ai modifié pour écrire la RTT sur la console:
Vous souhaiterez peut-être effectuer plusieurs requêtes ping, puis calculer une moyenne, en fonction de vos exigences en matière de cours.
OriginalL'auteur Stephen Kennedy