[UDP] temps-réel dans un jeu - stratégie à adopter ?

docteur_re Messages postés 13 Date d'inscription vendredi 17 décembre 2004 Statut Membre Dernière intervention 7 avril 2006 - 12 mars 2006 à 11:23
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 - 13 mars 2006 à 14:25
bonjour a tous,





imaginons le cas de figure suivant :





j'ai 2 programmes, client et serveur.


- le premier écoute les evenements d'un joystick et envoie les coordonées des axes par UDP au second


- le second les reçoit et les utilise.





l'udp est utilisé afin de garantir une transmission temps réèl (comme dans les jeux en réseau style FPS)





mon seul probème est de savoir quelle stratégie adopter pour envoyer ces paquets. Voici celles que j'ai envisagées :





1 - Les envoyer simplement avec un sento() à la suite les unes des
autres, à chaque réception d'un evenement joystick. Mais cela ne permet
pas de garantir que la dernière coordonnée est arrivée.




2 - Envoyer en permanence avec un sleep de 5 millisecondes les
coordonnées joystick. Un peu bourrin et surtout pourquoi 5
millisecondes et pas un autre nombre, cela dépendrait de la qualité du
réseau.




3 - Envoyer les coordonées avec un identificateur unique, puis
attendre une réponse avec ce meme identificateur pour en renvoyer un
autre. Oui mais si la réponse ne reviens jamais, le programme se
bloque. On peut alors penser à un timeout à partir duquel les
coordonnées sont réémise. Et encore une fois, quelle valeur pour ce
timeout ?




voilà, j'ai pas d'autres idées pour le moment. En fait jaimerais
bien m'inspirer des jeux existant genre counter-strike, ou ceux
open-source pour aller voir comment ils procèdent.


Si certain ont déjà eu l'occasion de travailler sur le problème....





Merci


bye

3 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 mars 2006 à 13:33
Salut,

Beaucoup de questions la dedans !

Je ne suis pas du tout un expert dans ce domaine, mais pour ce qui est des données resultant de l'action d'un joueur (et la reponse du serveur), j'aurais plutot pensé les envoyer en via TCP plutot qu'UDP. Parce que ca peut-etre assez genant si le serveur ne recoit pas les commandes du joueur (et reciproquement). J'utiliserais UDP plutot pour envoyer (depuis le serveur) les données resultant des autres joueurs (je veux dire par la que c'est moins grave s'il y a une perte de paquet par rapport a la position a l'ecran des autres joueurs, cela sera corrigé avec les paquets suivants). Le principal c'est que le serveur ait lui les positions exactes.

Du coup, en utilisant TCP, tu garantis que ton paquet est arrivé, et ton choix 1) est faisable.
Je ne pense pas que la 2) soit une bonne idée. Et la 3), revient en fait implicitement a la un (du fait du fonctionnement du protocole TCP).

Par contre, si ca se trouve, je me trompe a 100% (je t'expose juste l'idée que je m'en fais)
Es-tu allé voir ce qu'ils disaient a propos de ce sujet sur les sites spécialisés developpement de jeu (style gamedev)



Mx
MVP C#
0
docteur_re Messages postés 13 Date d'inscription vendredi 17 décembre 2004 Statut Membre Dernière intervention 7 avril 2006
13 mars 2006 à 14:14
va voir là : http://www.cppfrance.com/forum.v2.aspx?ID=685163

en fait TCP est beaucoup plus lent que UDP ce qui empèche le temps-réel du fait de tout le mécanisme de traitement des erreurs.

en l'occurence le 3 ne revient pas du tout à faire du TCP, TCP étant beaucoup plus complexe que ça.

mais va voir l'autre thread, tout est bien expliqué

bye ;)
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 mars 2006 à 14:25
Oki, donc en fait tu avais eu ta réponse ;)
Je prends note des conseils que tu as eu sur l'autre article. J'avais pas envisagé la lourdeur de TCP dans ce sens. Donc en effet, UDP a l'air conseillé dans ton cas.

Bonne continuation



Mx
MVP C#
0
Rejoignez-nous