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

Architecture réseau

Caudheur
Caudheur
Niveau 8
11 juillet 2013 à 13:57:45

Salut à tous !

J'essaye de programmer un petit jeu multijoueur. C'est un jeu de plateforme, donc temps réel et beaucoup d'inputs à gérer chez chaque client.

Ma question concerne l'architecture du moteur réseau.
Quelles informations envoyer, quand et comment ?
J'hésite entre les sockets UDP et TCP.

La solution que j'envisage en ce moment est d'utiliser TCP pour envoyer exactement chaque input (appui de touche, clic de souris...) du client 1 au client 2 (via un serveur). Ainsi, le client 2 peut reproduire les actions du joueur 2 en interne.
Cependant, je trouve déjà de nombreux désavantages à cette idée.

Si vous avez des pistes ou des conseils, ça me ferait très plaisir d'en apprendre plus sur l'architecture réseau (à un niveau modeste bien sûr, pour l'instant j'essaye juste avec 2 joueurs en LAN).

Voilà, merci d'avance et bonne journée ! :)

urizen45
urizen45
Niveau 5
11 juillet 2013 à 14:32:48

Hello,

Si tu es sur une architecture LAN entre deux postes, deja tu n'as pas besoin d'un serveur. Le serveur est utile pour des jeux avec un nombre de joueurs plus important et/ou au travers d'internet.

Le TCP est a mon avis la meilleure solution car tu assures la réception des informations. L'UDP ne te permettra pas ce genre de choses.

Ensuite au niveau de tes messages, si c'est un simple jeu de plateformes, tu peux juste définir un système ou tu envoies l'état de ton personnage sous deux variables :
1. son mouvement
2. son action

exemples :
AVANCE-TIR
SAUTE-RIEN
COURRE-SE BAISSE

Tu n'envoies un message entre les postes que si l'un des 2 paramètres change. Si le joueur avance pendant 15sec sans rien faire d'autre (ou ne bouge pas pendant x secondes) tu n'auras pas de message qui transitera durant ce temps

Tu fais par contre un contrôle avec ce qu'on appelle une "ligne de vie" qui renvoie le statut toutes les 1min afin de contrôler que les deux postes sont toujours connectés.

Déjà avec cette façon de faire tu devrais pouvoir avancer sereinement

A+
Uri

[-ArK-]
[-ArK-]
Niveau 30
11 juillet 2013 à 14:37:05

Perso j'utilise les deux

TCP pour ce qui doit arriver à coup sûr (dégâts sur un ennemi, etc)
UDP pour ce qui est pas trop important mais qui doit arriver vite (inputs des déplacement d'un joueur)

après ça dépend de ton jeu :hap:

Caudheur
Caudheur
Niveau 8
11 juillet 2013 à 14:51:15

Merci à tous, et merci Uri, ta réponse m'éclaire bien :)

Donc si je me passe de serveur, l'architecture ressemblera à ça : https://image.noelshack.com/fichiers/2013/28/1373546964-archi-reseau.png

(l'engrenage bleu est le moteur physique qui gère les inputs).

EcailleDeLune
EcailleDeLune
Niveau 6
11 juillet 2013 à 15:00:11

T'as des libs très utiles pour le réseau, genre enet ou raknet (suivant quelle licence tu veux).

urizen45
urizen45
Niveau 5
11 juillet 2013 à 15:20:50

Houla,

Attention, tu n'avais pas parlé d'un moteur physique. Ce genre de moteur est bien plus complexe a synchroniser en réseau !

En LAN ca ne devrait pas poser de problème mais si tu espères un jour porter ton projet via le Net ca peut provoquer des situations inattendues car un meme evenement sur ton moteur a quelques millisecondes d'intervalles peut provoquer des situations différentes.

Dans ce cas, je te conseille plutôt de passer par un serveur qui gèrera ta physique globale et enverra un état du monde aux joueurs.

En gros, ton joueur envoie un message identique a ce que j'ai dis au dessus.
Ensuite le serveur gère le monde d'un point de vue physique
Enfin il envoie un vecteur normalisé de déplacement a chaque client.

Tu peux aussi passer par un moteur physique interne au client afin de faire de la précognition et corriger les erreurs via les messages envoyés par le serveur.

A+
Uri

Caudheur
Caudheur
Niveau 8
11 juillet 2013 à 16:20:47

Ecaille deLune : vu la modestie de mon projet je me contente de la SFML :)

Uri : c'est ce que je me disais (risque d'asynchronicité...). Du coup ça va être plus long que je ne le pensais, mais ça a l'air aussi dur que passionnant à réaliser.

Encore merci, si ça marche je vous tiendrai au courant.

urizen45
urizen45
Niveau 5
11 juillet 2013 à 16:42:30

Petite question :
Tu codes en quoi ton projet ?

A+
Uri

Caudheur
Caudheur
Niveau 8
11 juillet 2013 à 16:50:01

C++, j'utilise SFML avec Code::Blocks.

Ça va faire 2 ans que je programme en amateur, et là j'ai envie de m'attaquer au réseau

Caudheur
Caudheur
Niveau 8
11 juillet 2013 à 17:02:19

Pour revenir au serveur qui gère le monde, mon plus gros problème reste de savoir ce que le serveur envoie aux clients pour les mettre à jour.

Il faudrait envoyer la position des joueurs au moins tous les dixième de seconde pour que ce soit fluide. Est-ce possible en TCP ?

Caudheur
Caudheur
Niveau 8
12 juillet 2013 à 12:29:08

Encore une petite question.
Imaginons que le client et le serveur aient tous deux une classe en commun : "classe.hpp".
S'ils utilisent exactement la même, est ce que je dois recopier pour le client et le serveur le fichier .hpp ou est ce que je peux le factoriser ?

PatateChocolat
PatateChocolat
Niveau 9
12 juillet 2013 à 12:37:46

Concernant l'envois, tu peux simplement faire un boolean "moved" qui passe à true si le joueur à bougé, ou qui reste à false si le joueur n'a fait aucun mouvement. S'il passe à true du envoies à tous les clients la nouvelle position du joueur.

(A faire dans une partie update du serveur :hap: ).

urizen45
urizen45
Niveau 5
12 juillet 2013 à 14:28:05

Hello,

Oui essaie de travailler avec des variables prenant le moins de bits possible afin d'avoir un message le plus léger possible.

Perso je travaille avec des énumérations.
Mon message est composé de l'ID du client, son mouvement, son action.

Exemple d'énumération

<Serializable()> Public Enum EStatus As Integer
StandBy
Walk
MoveBack
Run
Fall
JumpUp
JumpRequest
Flyhack
StrafeLeft
StrafeRight
End Enum

Mon message sera de cette forme :
1524|EStatus.Walk|EAction.Shoot

A+
Uri

Caudheur
Caudheur
Niveau 8
12 juillet 2013 à 14:46:41

Merci bien, c'est très éclairant :)
Et pour les classes partagées, des idées ?

Caudheur
Caudheur
Niveau 8
04 août 2013 à 10:56:12

Une autre question rapide : vaut-il mieux envoyer régulièrement la position de tous les objets aux clients, ou alors peut on se contenter d'update la position d'un objet que quand celui-ci est déplacé ?

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