Encore une trad'.
Cette fois-ci, ça sera ce guide : http://www0.org/w/Networking,_lag_meter ... ban_Terror
Il a été écrit par la personne auteur de la rebuild du moteur ioq3 dont je vous parlais la dernière fois (mitsubishi).
Un guide très utile pour comprendre le netgraphe, savoir comment le lire, et il répond à beaucoup de questions qu'on a tous pu se poser un jour concernant le réseau sur Urban Terror.
Guide approfondi sur l'étude des paramètres réseaux et du netgraphe sous Urban Terror
"Hits ?", "Lag" ? Ce guide tente d'établir quelques vérités sur ces symptômes courants en expliquant quelques concepts intéressants relatifs au réseau et à la fluidité du jeu, comme une bonne lecture de votre netgraphe et l'utilisation de cvars. Le but est d'aider à diagnostiquer les problèmes que vous pourriez rencontrer et de constituer une base de connaissance pour des solutions potentielles. Par ailleurs, les informations données ici pourront vous aider à améliorer l'efficacité de votre jeu même si vous n'avez aucun problème en apparence.
Nous commencerons avec une section dédiée au netgraphe, à cause de son aide précieuse au diagnostique des problèmes. Puis nous continuerons avec les concepts majeurs ayant un intérêt ici. Une section dédiée à l'administration des serveurs est inclue, ce qui pourra être également utile aux joueurs. Quelques autres concepts pertinents et des question fréquemment posées concluent ce document.
Remarques introductives
Complexité du guide
Il peut paraître en effet complexe sans certaines connaissances de base concernant le réseau, et certains aspects concernant le moteur du jeu. Cependant, j'ai fait un effort pour être aussi compréhensible que possible. Vous pourriez avoir besoin de procéder à plusieurs lectures (et revenir à la première partie) si vous êtes confrontés certains concepts pour la première fois.
Précision du guide
Des omissions et des erreurs peuvent être présentes. Je tente actuellement de l'améliorer.
Les phrases [entre crochets] indiquent les parties qui peuvent nécessiter une révision ou une attention accrue. Les répétitions sont assez présentes afin d'être plus clair. Parfois des renvois sont faits à d'autres sections.
Glossaire
-
Client : Le jeu côté joueur, l'installation du jeu par le joueur et son matériel.
-
Serveur : Le côté serveur, les opérations effectuées par lui, la machine utilisée, son matériel réseau et sa propre installation du jeu.
-
Lag meter : compteur de lag, netgraphe, lagometer, cg_lagometer...
-
Client->Server : l'envoi d'infos du client au serveur.
-
Server->Client : l'inverse.
Le netgraphe
(Ndr : terme utilisé pour tout le guide)
Les différentes parties du netgraphe
En termes basiques, nous distinguerons la partie du haut et la partie du bas.
Comment afficher le netgraphe
Tapez dans la console :
cg_lagometer 1
Vous pouvez également introduire cette cvar dans vos .cfg ou la binder (utile).
Comment lire le netgraphe
Un netgraphe en état normal
En général, devrait être :
-
Ligne du dessus : Toujours bleue, avec une forme en dents de scie régulière.
-
Ligne du bas : Toujours verte et parfaitement plate.
Exemple :
Un joli netgraphe avec 64 de ping. Aucun problème n'est visible.
La ligne du dessus
Cette ligne indique l'interpolation / extrapolation. En fait, cette ligne avance d'un pixel à chaque rendu image. Une ligne entièrement bleue et avec de petits pics montre l'interpolation (c'est-à-dire que le jeu devine l'état de la "frame", (ndr : c'est-à-dire de ce que le joueur voit selon ce que le serveur lui envoie) entre 2 snapshots d'information) normalement effectuée, dans ce que le serveur envoie au client. C'est l'idéal.
Note du traducteur : la notion de "snapshot" est difficilement explicable et n'est pas traduisible, et elle sera réutilisée par la suite. Conceptuellement, un snapshot est la "mise à jour" des informations dont dispose le client pour reproduire ce qui se passe réellement sur le serveur (principalement la position du joueur et des autres joueurs par rapport à lui), ce qui lui sert bien sûr à afficher la position (réelle ou supposée) des autres joueurs, les bruits, etc. A chaque snapshot, ces informations sont réactualisées.
Le jaune sur la ligne du dessus
Le jaune signifie une fluctuation instable de plus de 50 millisecondes dans le taux de fréquence des snapshots. Cela conduit le client à "extrapoler" (il doit deviner de manière plus ou moins certaine ce qu'il doit afficher à l'écran) à partir de ce qu'il a reçu en dernier depuis le serveur. Une telle prédiction peut bien sûr être totalement erronée, ce qui cause certains problèmes dans le jeu (comme les problèmes de hits).
C'est là que ut_timenudge peut aider, car cela indique au client d'attendre plus de 50 millisecondes avant de passer à la frame suivante (et donc ne devrait pas être utilisé dans la plupart des cas). Vous en saurez plus sur le timenudge en lisant plus en avant ce manuel.
Plus techniquement, 50ms correspond à l'intervalle normal entre les différentes "update" (mises à jour des infos), sachant que le ratio sv_fps / snapshots est de 20 (20 fois par seconde, il y a 1000 msec dans une seconde, donc / 20 = 50ms). Si cette "update" - à cause d'une connexion instable ou de problèmes logiciels - arrive à une fréquence supérieure à 50ms (ou pas du tout), le client doit extrapoler (et tenter de deviner ce qui se passe sur le serveur), et l'indique sous la forme de pics jaunes.
Souvent, ce qui cause l'extrapolation, c'est le rate / sv_maxrate qui retarde la réception des snapshots par le serveur pour sauvegarde de la bande-passante. Reportez-vous à la section sur le "jaune sur la ligne du bas" ci-dessous. Similairement, les lignes rouges sur la ligne du bas (ci-dessous également) peuvent être en relation directe avec le jaune sur la ligne du dessus. La raison est simple : supprimer ou sauter des snapshots revient en fait à les retarder à l'extrême, et donc encore à forcer le client à extrapoler.
[Une autre raison possible est un CPU un peu submergé, ce qui rend le jeu incapable d'envoyer suffisamment de paquets à temps ("à temps", c'est-à-dire dans le ratio de 20 fps / snaps). Cela apparaît souvent sous la forme d'une large zone de jaune qui atteint la limite supérieur du netgraphe.]
Ligne du dessous
C'est la latence des snapshots et de leurs drops. Elle avance de 1 pixel à chaque snapshot d'information que le client reçoit du serveur (actuellement le taux est bloqué par le jeu sur un ratio de sv_fps / snaps à 20, comme vu ci-dessus). Si le dessus de la ligne (en vert) n'est pas parfaitement plat, alors le ping n'est pas parfaitement stable. Sa hauteur indique simplement l'importance du ping. S'il est bas, la ligne sera fine et inversement. L'idéal est d'avoir une ligne parfaitement plate et très fine. Le ping est également indiqué en chiffres dans le ping meter.
Lignes rouges
Cela indique que le snapshot du serveur a été sauté (perte de paquet server->client).
C'est généralement mauvais [car cela interrompt le transfert normal d'informations]. Une cause fréquente est que la connexion entre le client et le serveur (la capacité d'upload du serveur, ou la capacité de download du client) est "congestionnée" (surcharge) et que la bande-passante n'arrive pas à suivre. Un sv_maxrate plus bas (ou le rate pour le client) peut aider à résoudre le problème. Cependant, il peut s'agir de n'importe quoi entre les deux machines qui cause une instabilité ou qui monopolise la bande-passante.
Comme indiqué plus haut, c'est en relation directe avec l'extrapolation (et le jaune sur la ligne du dessus), car avoir bien sûr des paquets sautés ou perdus revient strictement à les avoir très en retard (plus de 50ms), ce qui force encore le client à extrapoler. Egalement, nous verrons plus bas comment aider à solutionner cette situation avec le ut_timenudge plus bas.
cl_packetdup n'est PAS lié directement à cette situation car il duplique les informations envoyées
par le client au serveur (et non l'inverse), afin d'être plus sûr que les infos arriveront au serveur, car si un paquet se perd en route, un deuxième ou un troisième permettra quand même à l'info d'arriver à temps. Cependant, il est probable que la raison qui ait causé une perte de paquet entre le serveur et le client entraîne également une perte de paquets dans l'autre sens (un modem un peu faiblard, etc), donc quelque part, augmenter le nombre de paquets envoyés peut au moins améliorer la connexion entre le client et le serveur (sans agir dans le sens inverse). Une autre raison d'agir sur le cl_packetdup est que le netgraphe n'indique pas directement la qualité du transfert client->server (il n'affiche que l'inverse), ce qui fait qu'on est un peu dans le flou lorsqu'on s'intéresse à ce qui se passe du client au serveur (un netgraphe disponible côté serveur serait vraiment très utile, pour monitorer les infos client->serveur).
Jaune sur la ligne du bas
C'est théoriquement normal même si cela devrait être évité dans la mesure du possible. Il indique un retard du "taux de délai", ce qui signifie que selon le rate et le sv_maxrate, un snapshot du serveur a été supprimé afin de préserver la bande-passante. Donc si vous voulez un jeu fluide et fiable, vous devriez faire en sorte de l'éviter. La raison principale à cela, est qu'un taux de transfert un peu en retard entraîne (encore) une extrapolation (et du... jaune sur la ligne du dessus !), forçant le jeu à deviner la position des autres joueurs par exemple, ce qui entraîne des soucis de hits et d'autres.
Cela devrait être moins fréquent depuis que la valeur la plus basse permise par le jeu est de 8000. Cependant, un serveur fréquenté, de 16 joueurs ou plus, peut nécessiter jusqu'à 12000 ou 15000 sur le sv_maxrate, pour éviter le jaune sur la ligne du bas (lui-même source de jaune sur la ligne du dessus). Si vous pouvez vous le permettre en bande-passante (car une surcharge en upload est encore pire : lignes rouges), une valeur sûre serait de 25000 (0 est la valeur par défaut, il correspond également à la valeur la plus haute, 250000). Reportez-vous à la section concernant l'administration de serveurs ci-dessous pour plus d'infos.
Les trous sur la ligne du bas (pas de couleur du tout)
Cela arrive lors d'un "freeze" temporaire, dû au CPU ou autre, ce qui arrive souvent lors d'une lecture ou écriture sur le disque par le moteur du jeu pendant que vous jouez (par exemple). Vous pouvez constater ce phénomène lorsque vous faites "/screenshot" (écriture d'un fichier image sur le disque), mais cela peut également venir d'autres problèmes tels qu'un bug dans le pilote graphique ou d'une surchauffe de votre carte vidéo.
Un exemple :
En fait, quoique le moteur du jeu puisse faire, il peut avoir besoin d'un certain temps pour effectuer les opérations demandées. Un trou va apparaître lorsque le moteur nécessite un peu plus de temps pour finir une opération et qu'il zappe tout le reste. Cela n'est bien évidemment pas normal.
Un grand secours peut venir de
cette build optimisée. Elle résout notamment les deux problèmes les plus fréquents qui causent des freezes : la radio et quelques autres samples audios et funstuff qui n'étaient auparavant pas préchargés par le jeu.
Comme un trou vient souvent d'un accès disque pendant le jeu (ce qui ne devrait pas avoir lieu), vous pouvez essayer un
/fs_debug 1 et voir s'il y a des accès écriture/lecture sur le disque pendant que vous jouez.
Lignes noires
Cela indique que l'antiwarping a été utilisé côté client. Normalement lorsqu'un joueur warp, cela se voit sur le serveur (il se téléporte), mais l'antiwarp permet aux autres joueurs de ne pas le voir. Le warp se produit lorsque le serveur ne reçoit pas les infos de manière assez fréquente pour updater sa position sur la map, ce qui est dû à des pertes de paquets importantes entre le client et le serveur, ou un ping totalement instable. L'antiwarp est contrôlé par le serveur (voir plus bas). [Cela va simultanément rendre le jeu instable pour le warpeur, qui peut trouver le jeu (encore) plus difficile à contrôler.]
Comme cela peut indirectement signifier une importante perte de paquets du client au serveur (ce qui n'est pas affiché je le rappelle par le netgraphe), la commande cl_packetdup peut aider dans une telle situation (essayez de le mettre à 3 par exemple). Toutefois cela ne sera d'aucun secours si le warp provient d'un ping instable. Un cl_maxpackets peut également aider, même s'il est confiné dans une fourchette 30-42 sur UrT.
Limitations du netgraphe
La limitation la plus importante du netgraphe nous l'avons dit, et que s'il est plutôt complet au niveau de ce qui se passe entre le serveur et le client, en revanche, on ne sait pas, du moins pas directement, ce qu'il se passe pour les commandes envoyées par le client au serveur. En effet, seul un netgraphe côté serveur peut l'indiquer.
C'est la raison pour laquelle cl_packetdup est plus important en réalité qu'il n'y paraît, car si son effet n'est pas directement affiché sur le netgraphe, le fait d'envoyer plusieurs fois la même info au serveur pour augmenter les chances de réception est très utile.
Comme mentionné plus haut également concernant les lignes rouges, il faut garder à l'esprit que le rouge n'indique uniquement que les infos venant du serveur ont été perdues, et non l'inverse. Ainsi, un drop du client au serveur peut exister même si la capacité d'upload du serveur est correcte, mais que sa capacité de download se trouve poussée à ses limites, et plus généralement, lorsque la capacité d'upload du client ne suit pas (en effet la plupart des connexions de particuliers sont très limitées en upload, alors que le download peut être très correct).
En conclusion, un netgraphe sur la machine serveur pourrait être d'un intérêt significatif pour dresser un tableau complet de la situation concernant les pertes de paquets client->server ou les connexions instables.
Aspects importants concernant le jeu
ut_timenudge
ut_timenudge (également connu dans UrT sous le nom de "local net buffer") retarde l'acheminement des informations de jeu vers le client pour rendre le jeu plus "régulier", plus "lisse". Cela consiste à créer une sorte de lag local pour faire en sorte que le jeu soit plus uniforme dans son affichage. D'où l'importance de savoir quand l'utiliser, quand ne pas l'utiliser, et quelle valeur pourrait être efficace.
Pour comprendre le fonctionnement de cette commande, vous devez savoir comment le jeu marche en ce qui concerne le partage d'informations entre le client et le serveur.
Le serveur et le client ont une "discussion" pendant le jeu, ils échangent ce qu'ils savent sur le déroulement de la partie. Les informations sont envoyées au client par le serveur toutes les 50 millisecondes (intervalle dû au ratio de 20 de sv_fps / snaps et 1000 ms (1 sec) / 20 = 50ms). Parallèlement, le client envoie ses propres infos et ses commandes (avancer, tirer...) au serveur selon le cl_maxpackets et les FPS, bien que cela n'ait qu'une petite influence sur l'utilisation du timenudge.
Si la ligne du dessus a des pics jaunes, cela signifie que le client n'a pas eu les informations attendues au moment prévu (plus de 50 ms depuis le dernier snapshot, rappelez-vous) et donc la "discussion" n'est pas aussi régulière qu'elle devrait l'être. Le jeu et le serveur doivent donc deviner ce qui se passe en se basant sur les dernières infos reçues (extrapolation). En mettant le timenudge par exemple à 30, le client attend 30ms de plus avant de retranscrire à l'écran ce qu'il sait à partir des nouvelles infos obtenues, dans l'espoir d'obtenir au final un rendu plus fidèle à la réalité et de rendre le jeu plus fluide, au cas où des informations un peu en retard finiraient par arriver.
Quand ut_timenudge est utilisé, la barre du haut sur le netgraphe devient plus épaisse. Visuellement, il devient plus dur de voir du jaune, car l'épaisseur de la barre va le couvrir plus facilement [(même si cela ne signifie pas pour autant qu'il n'y a pas d'extrapolation du tout.)]

Vous pouvez tester 10 ou 20 en valeur (comme proposé par le codeur du timenudge, TwentySeven), même si vous n'avez pas de problème apparent, au moins à court terme. Vous pouvez aller de 0 à 50 (les valeurs négatives ne sont pas acceptées par le jeu).
A bas niveau, ut_timenudge altère en fait les timestamps des paquets entrants pour faire croire qu'ils arrivent un peu plus tard.
cl_timenudge présent auparavant sur les mods q3 permettait également de différer les paquets client->server, mais c'était un exploit qui pouvait être utilisé pour créer du warp artificiel, et UrT a supprimé cette variable.
Ce procédé ajoute donc du lag en local, et donc ce que vous aurez à l'écran sera une représentation un peu "en retard" par rapport à ce qui se passe réellement sur le serveur (disons encore plus tard que ce qui est normalement dû à une latence classique). Par conséquent, vous ne devriez pas jouer sur le timenudge si vous n'avez pas vraiment de pics jaunes, ou plus généralement, s'il n'y a pas de problème que le timenudge serait le seul à pouvoir régler. Ce qu'on pourrait appeler les "hits" peuvent s'améliorer en évitant l'extrapolation décrite ci-dessus.
L'antilag (voir ci-dessous) est pris en compte lorsque le timenudge altère les temps de perception de la réalité du jeu, son fonctionnement n'est donc pas perturbé.
Si vous n'avez que quelques pics jaunes épars, vous ne devriez probablement pas utiliser timenudge, car avoir un jeu un poil moins fluide toutes les 10 ou 20 secondes est toujours mieux qu'un lag local permanent.
L'antilag et les "delayed hits" (hits derrière un mur)
Le "code sans lag" ("unlagged code") (opéré par le serveur), également connu sous le nom d'antilag sous UrT, évite d'avoir besoin de prédire où une cible qui se fait tirer dessus "sera" pour compenser le lag (alors que c'était le cas au tout début d'UrT). L'antilag fonctionne de manière à garder une trace de "où et quand" un attaquant (celui qui fait feu) a vu une cible, en tenant compte de la latence naturelle du jeu.
Donc, quand un joueur avec un gros ping voit un joueur avec un faible ping, il le touchera toujours à l'endroit où il pensait viser, sans avoir à prédire où la cible "se trouvera" en tenant compte du lag (même si, en tenant compte du lag du tireur, l'enregistrement du tir (lorsque le serveur traitera l'info selon laquelle le joueur a appuyé sur fire) sera toujours plus tardive que s'il s'agissait du faible ping qui tirait).
L'effet collatéral est courant : un gros ping va effectivement pouvoir toucher le faible ping "dans le coin du mur", c'est-à-dire "derrière" en fait. Le petit ping pourra avoir été dans la ligne de mire du gros ping au moment où il se faisait tirer dessus, cependant en raison du lag plus important du gros ping, le joueur avec le gros ping a vu la scène se dérouler "plus tôt" que depuis la perspective du petit ping. Si vous voulez, dans le "temps réel" du petit ping, ce dernier a effectivement pu se cacher derrière un mur mais en fait le gros ping le voit toujours bien visible sur son écran (car il a un lag supplémentaire). Donc le gros ping va tirer, et c'est là que l'antilag va "l'aider", en lui permettant d'atteindre tout de même sa cible, en se basant sur ce que voit le gros ping (plutôt que de se fier à la réalité, en fait), ce qui va éviter de devoir tenir compte du lag tout simplement. Par conséquent, le petit ping va avoir l'impression de se faire tirer dessus alors qu'il est caché derrière un mur, et c'est bien ce qui se passe. (Ce phénomène est également présent lorsque ce sont deux gros pings qui se tirent dessus, mais c'est plus compliqué à décrire. On peut également considérer la perspective du gros ping qui se fait tirer dessus par un petit ping, ça marche également.)
Toutefois, le gros ping sera toujours handicapé par rapport au petit ping, car le gros ping voit toujours ce qui se passe sur le serveur un peu en retard par rapport au petit ping. Les plus petits pings auront toujours une longueur d'avance sur les autres.
On pourrait théoriquement contrebalancer ce petit effet collatéral en faisant en sort que le netcode ignore les infos de hits lorsque ce phénomène apparaît (peut-être que cela demanderait plus de ressources), donc je ne serais pas surpris si c'était le cas dans une version ultérieure du jeu.
Gardez à l'esprit cependant que dans un jeu où toutes les armes sont en "hitscan" (c'est-à-dire que le jeu fait abstraction totale des règles physiques élémentaires de balistisque : une balle dans la réalité a un véritable chemin à parcourir, chemin qui prend du temps et qui peut être dévié - le hitscan, qui est présent dans la quasi totalité des FPS, est le nom donné au fait que les armes touchent instantanément leurs cibles), comme UrT (quake3 avait seulement des railguns et des machineguns), l'antilag reste tout de même d'une grande importance pour un jeu plus fluide. Probablement la plus grande partie des faibles pings (50-60ms) eux-mêmes trouveraient les hits plus aléatoires s'il n'existait pas.
L'antilag ne peut pas être modifié, désactivé ou altéré, du moins "légalement", et c'est probablement mieux ainsi.
Note : Sachez également que le phénomène du "hit derrière les murs" peut avoir existé sans l'antilag, à cause du lag classique, mais il était alors beaucoup moins prononcé.
L'antiwarp
L'antiwarp est un système côté serveur également qui simplement rend les gens moins susceptibles de warper. C'est plus difficile de voir les warpers "en vrai" de nos jours. Souvent, ce n'est pas vraiment eux qui warpent, mais l'observateur qui a une connexion instable. Parfois, ils warpent réellement car l'admin du serveur n'a pas bien configuré l'antiwarp. Le warp apparaît lorsque le serveur ne reçoit pas les infos du joueur assez fréquemment (ping instable, pertes de paquets).
Si l'antiwarp agit sur vous, vous le verrez avec des lignes noires sur le netgraphe. Cela peut être l'indication que vous perdez des paquets en route, et cl_packetdup peut aider dans ce cas. Cependant, vous pouvez warper à cause d'un ping fou, et alors dupliquer les paquets ne sera d'aucune aide.
Reportez-vous à la section plus bas pour savoir comment configurer l'antiwarp côté serveur.
/rate
Le "rate" contrôle la densité du trafic entre le serveur et le client (combien de bytes par seconde il l'autorise à lui envoyer). C'est également limité par la variable serveur sv_maxrate et sv_minrate (par exemple si ces variables contiennent 20000 et 12000, vous serez vous-même limité entre ces 2 valeurs).
Ce n'est plus vraiment d'une importance capitale de nos jours depuis que le jeu utilise ce qu'on appelle la "compression delta" et qu'un client utilise facilement entre 4 et 8Ko/sec (même si on peut toujours assister à un certain engorgement dans les valeurs les plus basses, 8000 correspondant à 7.81Kb/s).
Ainsi, un rate très bas, disons à 8000 ou 10000 sur un serveur fréquente (16+) est souvent une source de jaune sur la ligne du dessus et du bas, ce qui nuit à la fluidité du jeu. Reportez-vous éventuellement à la partie consacrée à l'admin serveur pour plus d'infos.
Aujourd'hui garder cette valeur à 25000 ne devrait pas poser de problèmes pour la majorité des connexions avec une bande-passante correcte. Cela correspond à un taux (bytes / secondes) de 24.41Kb/s seulement (taux qui n'est même pas atteint dans la réalité la plupart du temps). Il y a eu une rumeur selon laquelle si le serveur mettait son maxrate en dessous de 25 000, c'était mieux de mettre également une valeur inférieure, mais on peut en douter fortement (parce que le serveur vérifiera toujours le taux du client pour l'ajuster dans sa propre fourchette).
Le réglage du taux est également important pour la VoIP dans les récentes versions de ioquake3 ; si jamais IoUrT inclut cette fonctionnalité dans une version ultérieure (a priori sera le cas dans la 4.2), il est conseillé de garder cette valeur assez haute, bien sûr toujours dans la limite acceptée par votre connexion.
La meilleure indication pour définir le meilleur /rate est la présence ou non de jaune sur la ligne du bas. S'il y a du jaune au lieu du vert, cela signifie que le client indique que son taux de transfert a été perturbé. Idéalement, pour une latence minimale et pour éviter le jaune sur la ligne du dessus, vous devriez éviter cela.
Bien sûr, même aujourd'hui où les besoins du moteur du jeu sont des cacahuètes pour la bande-passante des connexions modernes, n'oubliez pas qu'un taux important sur une connexion lente est pire qu'un taux plus réduit, car un taux réduit signifie tout au plus un jeu un peu instable, alors qu'un taux de transfert important pour une faible connexion va lui causer du lag majeur. C'est également d'une certaine importance car le lag peut venir du serveur ou même de n'importe où ailleurs à travers l'internet.
cl_maxpackets et les FPS
Ce que fait cl_maxpackets
A l'inverse de rate, cl_maxpackets définit la quantité maximale d'informations envoyées par le client au serveur, par seconde. Sous UrT, cette variable est bloquée entre 30 et 42. C'est en forte corrélation avec les FPS du client.
Important (et peut-être moins compréhensible)
Les FPS constituent un élément majeur du jeu, qui gouverne bien d'autres choses que les FPS. Ainsi, le client ne peut envoyer qu'une seule "update" à chaque frame, ou une toutes les 2 frames, ou une toutes les 3 frames... Ainsi, si vous êtes à 125 FPS, vous pouvez envoyer 125 updates par seconde au serveur, ou 62.5 par seconde, ou 41.7 par seconde, 31.25, 25... (les valeurs ne sont pas arrondies par le jeu). Si vous avez un drop 100 (ou si vous avez fixé vos FPS à 100), les valeurs seront diminuées proportionnellement : 100 infos par seconde, 50, 33.3, 25, 20...
-
Ce que cela signifie
Donc, si vous avez un cl_maxpackets à 30 pour 125 FPS, le client enverra 25 updates par seconde. Si vous avez 100 FPS, il enverra encore 25 infos par seconde. Si vous avez un maxpackets à 42, il enverra 41.7 up par seconde pour 125 FPS (et en fait on comprend que 42, la valeur max autorisée par le jeu, correspond à la valeur la plus optimisée pour des FPS stables à 125), et enverra 33.3 up par seconde à 100 FPS.
Aidez-vous de vos maths et de votre logique pour calculer les autres cas.
Le principe de base ici est d'obtenir la latence la plus faible possible en envoyant le plus de paquets possible au serveur, par exemple en conservant une stabilité à 125 FPS. Pour 125 par exemple, il semblerait que 42 corresponde le mieux.
Un exemple de mauvais choix serait par exemple si vous limitez vos FPS à 60 dans le jeu, le client sera capable au choix d'envoyer 60, 30 ou 20 paquets par seconde au serveur. Cela signifie que le jeu ne sera pas capable d'utiliser au max un maxpackets à 42, mais seulement de 30. Similairement, avec 100 FPS, il pourra n'envoyer que 33.3 up par sec.
Peut-être que la limite de 42 sera levée dans le futur d'UrT (jusqu'à 125 ?), ce qui rendrait le jeu bien plus fluide.
-
A savoir pour régler ses FPS max avec com_maxfps
Maintenant, lorsque vous définissez votre com_maxfps pour tenir compte des informations données ci-dessus, gardez à l'esprit que les FPS qui sont effectivement affichés à l'écran sont limités en valeurs de 1000ms divisés par un nombre entier, parce que le moteur du jeu calcule la durée des frames en utilisant des nombres entiers en millisecondes. Donc vous ne pouvez que mettre 125 FPS (1000/8), 111.11 (1000/9), 100, 90, 90.9, 83.3, 76.9, 71.4, 66.6, 62.5, 58.82, etc. (sans arrondir).
[Par exception, ne tenez pas compte de ceci lorsque vous avez la vsynch activée, car le rendu sera forcé pour correspondre à la fréquence du moniteur, en général de 60Hz).
En règle générale
Selon ce qui a été dit ci-dessus, on peut conclure sur le fait que dans l'intérêt d'une latence minimale, cl_maxpackets peut être laissé à 42 quels que soient vos FPS, sauf si vous avez vraiment besoin de limiter votre bande-passante (rare sur les connexions modernes). D'un autre côté - si vous pouvez vous le permettre - avoir 125 FPS max est une bonne chose pour une efficacité optimale, car cela correspond parfaitement à un taux de 42 paquets/seconde.
N'oubliez pas que si vous ne pouvez atteindre que 80 FPS, il peut être préférable d'avoir un com_maxfps à 80 et non à 125 car dans ce cas votre maxpackets atteindra 40 (pour les raisons mentionnées ci-dessus) au lieu d'une valeur plus basse, disons 90, où le max rate ne sera que de 30 (car 90/3 = 30 mais 90/2 = 45).
Cependant, cette conclusion peut être mensongère dans la mesure où un ordinateur moyen peut facilement atteindre les 90, et que de manière évidente (complexité du jeu, selon la map, le type de jeu, le nombre de joueurs, etc), la valeur réelle pourra fluctuer autour de 90, et les calculs ne seront que partiellement inapplicables.
1000 / nombre entier / nombre entier
La relation peut être résumée ainsi :
FPS = 1000 / nombre entier ; paquets par seconde envoyés au serveur = 1000 / nombre entier(FPS) / nombre entier.
Un arrondissement interne pas très logique
Le plafond de la variable est arrondi en interne de manière assez illogique : com_maxfps à 84 va jusqu'à 90.090... alors que 83 reste sur 83.333...
C'est-à-dire qu'un com_maxfps à 84 donne effectivement 30.30.. paquets par seconde parce que les FPS seront vraiment mis au max à 90.090, alors que la valeur correcte pour arriver à 41.666 serait plutôt 83, alors que c'est ce que nous voulons pour une latence minime avec le plafond disponible de cl_maxpackets.
cl_packetdup
cl_packetdup duplique les informations envoyées par le client au serveur afin d'augmenter la probabilité que les infos arrivent bien (un paquet droppé sera remplacé par le suivant). La valeur peut être de 1, 2 ou 3 selon le nombre de paquets identiques qui seront envoyés.
Activer cette fonction est bien plus important qu'il n'y paraît, car si le netgraphe est plutôt généreux en ce qui concerne les infos server->client, en revanche il est totalement muet concernant le chemin inverse. Ainsi, vous pouvez être confronté à un jeu instable alors que votre netgraphe semble correct. Bien sûr, si vous êtes confiants concernant les paquets envoyés (vous êtes sûr qu'ils arrivent tous à bon port), vous pouvez vous permettre de désactiver cl_packetdup afin d'arriver à une "latence absolument minime".
Comme on l'a déjà dit, des lignes rouges dans le netgraphe ne signifient PAS que le cl_packetdup sera obligatoirement utile. Les lignes rouges indiquent une perte de paquet du client au serveur, ce qui n'est pas le sens du chemin où cl_packetdup agit. Cependant, s'il s'agit de la même cause qui produit des pertes de paquets dans les deux sens, alors dupliquer les paquets pourra toujours améliorer la transition entre le client et le serveur (par exemple un matériel défectueux entre le client et le serveur).
De la même façon, des lignes noires indiquent que vous êtes victime de l'antiwarp côté serveur, et cela indique indirectement qu'il y a des pertes de paquets entre vous et le serveur et encore une fois dupliquer vos paquets pourra réduire le warp (même si, on l'a vu, le problème peut aussi venir d'un ping instable).