CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

jeu en réseau

neg282
neg282
Niveau 7
02 janvier 2006 à 18:18:10

bonjour

Je suis en train de faire un jeu de course en réseau (2 joueurs seulement), et j´ai un problème...avec le réseau...

Voila comment je fais pour le moment :

- La machine serveur lance le jeu et choisi un port (par defaut 6666).

- La machine client lance le jeu, rentre l´adresse IP du serveur, et choisi le meme numero de port que le serveur.

et dans la boucle principale :

-Input();
-Collisions();

-le serveur envoi les coordonnées de sa voiture au client.
-quand le client les a recu, il envoi les coordonnée de sa voiture au serveur.

-Affichage();

Cette méthode marche, mais ca rame (2-4 images secondes), sachant que pour la réception, la fonction est forcement bloquante...

Faut il que je revoi ma facon de transmettre les infos ? ou le problème vient-il d´alleurs ? N´importe quelle suggestion sera la bienvenue...

godrik
godrik
Niveau 30
02 janvier 2006 à 19:22:42

mmm, a chaud je ne sais pas. quelques pistes:
-met des timers sur l´affichage et la gestion du reseau.
regarde ainsi ce qui prends du temps.
-utilises tu des threads ? si non, est ce que ton affichage ne prends pas trop de temps en empiettant sur le "moteur de jeu". Si oui, n´as tu pas de problemes de synchronisation(ressources relaché trop tard)

Sinon, c´est moche de faire que le client dise ou il est...

Quintoff
Quintoff
Niveau 10
02 janvier 2006 à 19:28:50

C´est quel langage? C++? Java?...

dnob700
dnob700
Niveau 10
02 janvier 2006 à 20:00:48

Le problème est courant : il est du au "ping".

Même si tu as internet très très haut débit, pour que les info fasse un aller retour entre les deux machines il te faut plusieurs dixièmes de seconde.
Tu ne peut donc pas atteindre les info à chaque images, c´est trop lent.

Il faut donc faire ça en asynchrone et chaque client envoie en permanence les infos qui le concerne à l´autre programme et affiche le jeu en "améliorant" les dernières données qu´il as recu (par exemple en faisant continuer la voiture dans la même direction à la même vitesse). Et lorsque des info plus fraiche arrive, tu les mets à jours.

guyver2
guyver2
Niveau 10
02 janvier 2006 à 22:14:12

j´avais eu le meme prob avec un pong:
j´avais posé le meme genre de question et évidement obtenu la meme réponse.

comme dit dnob il faut que tu utilise des sockets asynchrones pour que la fonction de reception devienne non bloquante. et pouf... Si tu as reçu des infos tu mets a jour et sinon tu continu ave tes vielles info et tu mettra a jour au prochain passage dans ta fonction de reception.

sinon, mais c´est plus compliqué, tu peut utiliser des processus legers (thread) qui ne font QUE attendre tes infos pendant que ton prog principale continu a tourner.

neg282
neg282
Niveau 7
02 janvier 2006 à 22:29:38

En fait mainteant, je pense que je vais faire un programme serveur qui a en mémoire les coordonnées des 2 voitures, et 2 programmes client qui demanderont au serveur les coordonnées de l´autre voiture.

Mais comme la fonction qui recoit est bloquante, il me faut 2 processus pour le serveur. Je pensait faire un fork(), mais j´ai vu que ca ne marchait pas sous windows.

Comment je pourrai faire (en c++ et sous windows) pour diviser un programme en 2, et créer une zone de mémoire partagée par ces 2 processus ?

dnob700
dnob700
Niveau 10
02 janvier 2006 à 23:15:44

plusieurs possibilité : oou bien tu utilise CreateThread dans windows.h ou bien tu utilise mk_socket.
C´est une lib que j´ai écrite qui permet de gérer facilement des sockets en client ou serveur et en asynchrone en TCP.

tu peut la télécharger là :
http://lib.sectionpc.info/
ça marche sur windows et linux et en prime c´est open source donc tu peut regarder comment je gère les différend processus et t´en inspirer si tu veux.

guyver2
guyver2
Niveau 10
02 janvier 2006 à 23:32:09

sinon tu passe sous linux et tu utilise fork et pthread.

godrik
godrik
Niveau 30
03 janvier 2006 à 00:07:43

pas de memoire partage avec un fork (enfin, pas de facon simple)

Quintoff
Quintoff
Niveau 10
03 janvier 2006 à 00:14:57

Perso si j´avais pas fork, je ferais un thread qui récupère les données de l´autre joueur et qui modifie deux types de variables :
-les variables nécessaires au joueur
-une variable booléenne qui prend true quand elle est mise a jour et false quand elle est lue. Et dans ton thread principal tu fais
if(var_maj) //si nouvelles valeurs tu repositionne le joueur.

godrik
godrik
Niveau 30
03 janvier 2006 à 00:25:56

mmm, tu dis que la focntion qui recoit est bloquante.
tu nas besoin de faire des calcul que lorsqu´un joueur joue.
tu peux donc te contenter d´un select, non ?

Quintoff
Quintoff
Niveau 10
03 janvier 2006 à 00:29:59

Heu c´est possible :) mais c´est hors de mes compétences désolé... Je ne sais même pas ce que c´est un select :peur:

godrik
godrik
Niveau 30
03 janvier 2006 à 00:58:52

select est une primitive posix a qui tu donne un ensemble de file descriptor sur lesquels tu desire lire (ou ecrire) et qui te renvoie les file descriptor qui sont pret a te fournir des informations (ou sur lesquel tu peux ecrire).
un appel a select peut etre bloquant ou non ou peut rester en attente un temps durant.

je penses donc qu´un select ferait parfaitement l´affaire pour le probleme de neg.

Quintoff
Quintoff
Niveau 10
03 janvier 2006 à 11:12:00

Ouais en effet si j´ai bien compris ça devrais faie l´affaire :ok:

guyver2
guyver2
Niveau 10
03 janvier 2006 à 13:29:12

je m´était renseigné sur select et j´avais rien compris... j´avais trouvé les soket assynchrones plus simples. après c´est juste mon avis. j´ai peu etre loupé un truc tout con sur les select ...

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment