AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  Connexion  

Partagez | 
 

 39dll setsync()

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: 39dll setsync()   Dim 6 Juil 2014 - 16:56

J'ouvre un nouveau sujet sur la synchronisation. J'ai trouvé cette fonction dans le 39dll : setsync(arg0, arg1)
/*
Changes the blocking/non-blocking mode of a socket.

Argument0 = Socket to change.
Argument1 = Mode to set to. 0 = Blocking. 1 = Non-blocking.
*/
return external_call(global._SokF, argument0, argument1);


Si j'ai bien compris quand j'utilise le mode Blocking cela bloque le logiciel tant qu'il n'a pas reçu sa réponse pour un port donné c'est bien ça ?
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8924
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: 39dll setsync()   Dim 6 Juil 2014 - 20:25

Pour un socket donné. Mais oui c'est bien ça.
C'est pour ça qu'en général on a un thread de lecture supplémentaire, pour pas bloquer le thread principal.
Avec GM du coup, t'as tout intérêt a rester en non bloquant (par contre j'ai jamais utilisé ce mode, donc je pourrais pas t'aider la dessus).

_________________
                 
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 7:25

Ben en fait si j'utilise ce mode quand le serveur renvoie aux clients les données mises à jour, est-ce que ça ne garantirait pas la synchronisation de tous les clients ? (alors que le mode non bloquant non ?)
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8924
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 7:31

Je sais pas trop comment ça marche a ce niveau mais je pense pas que ça desynchro quoi que ce soit, étant donné que le mode TCP fonctionne en stream.

En gros quand t'envoies un message, la carte réseau du gars connecté va le récupérer, puis après lui depuis son appli (donc ton code) va utiliser une fonction pour vider une partie de ce buffer. Par contre de ce que je sais c'est que des fois plusieurs messages sont collés a la suite, donc faut généralement envoyé la taille du message avant le message pour voir si y en a plusieurs dans un même buffer.

_________________
                 
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 7:38

Moi je suis sur faucet networking, il suffit de faire socket_connecting() pour savoir si la connexion est en cours.
Pour ajouter à mes logs ce que le serveur à reçu (J'ai une fonction custom) je fais comme ça dans l'event step :
Code:
received = tcp_receive_available(ircsock);
if (received = 0)
{
    exit;
}
else
{
    addlog(read_string(ircsock, received));
}
(Dites vous foutez pas de moi pour le code, c'est juste du debug temporaire)

En passant tu ferais mieux d'abandoner 39dll au profit de faucet, c'est bien plus optimisé, car même 39ster (Le créateur de la DLL 39dll) affirme lui même qu'il a codé cette .dll quand il débutait en programmation et que le code était très crade.

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8924
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 7:47

Si on part de ce principe le mieux c'est d'abandonner GM tout court hein  crossa 

_________________
                 
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 8:03

Oui mais faucet se veut moins buggé, et plus simple d'utilisation, donc ça ne peut apporter que des bénéfices

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 16:44

Bon j'ai essayé pas mal de choses mais je ne m'en sors pas et je désespère... :p

Je réexplique plus clairement comment fonctionne mon multi :

Le jeu se joue à 4 joueurs, chaque joueur envoie au serveur ses inputs (droite, haut, gauche, bas, A, B) qui lui même les renvoies aux 4 joueurs (aucun input n'est traité en local par les joueurs jusque là) avec en plus un SEED généré par le serveur (pour synchroniser les apparitions aléatoires d'objets et de niveaux).

Ensuite le moteur du jeu traite localement les 6+1 données envoyées par le serveur.

Le problème c'est que de temps en temps un joueur se décale d'une ou deux frames et cela a des conséquences très fâcheuses pour la synchronisation (je fais les tests sur le même pc en lançant plusieurs fois l'application).

Comment puis-je avoir la garantie que les 4 joueurs restent synchro à la frame et à l'input près quitte à ce que ça freeze un peu de temps en temps ?

J'ai essayer Faucet mais je n'ai pas trouvé d'exemple proche de mon cas. Les seuls exemples que j'ai trouvé se contentent de synchroniser les coordonnées x et y, ce qui ne pose pas vraiment de problème s'il y a un décalage car cela se corrige par la suite).

Merci par avance !
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 16:52

Au lieu de synchroniser les inputs tu devrais traiter les changement de positions chez le client par ex, et envoyer les coordonnées x/y au serveur
C'est un gain de performances pour le serveur et ça limite considérablement l'utilisation de la bande passante

Au lieu d'envoyer la seed à chaque synchronisaton au client, il suffit de l'envoyer une seule fois au client.

Edit : La seed ne devrait jamais changer lorsque ton programme est en exécution.

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs


Dernière édition par Soundii le Lun 7 Juil 2014 - 17:31, édité 1 fois
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8924
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 17:26

Je t'avais bien précisé dans l'autre topic, que si tu envoies les input, faut aussi envoyer les coordonnées pour qu'il n'y ai pas de décalages.
Les input sont juste des helpers, pour pas avoir a gérer les animations, ni les interpolations de positions.
Et pour la seed normalement la valeur initiale suffit, si tu fais pas de bêtises oui.

_________________
                 
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 17:38

Merci Soundii, j'y ai pensé mais ça ne marche pas avec un bomberman like.

Car dans ce cas il faudrait envoyer toutes les coordonnées des bombes et des murs destructibles qui sont des éléments dynamiques. Je ne parle même pas des paramètres de chaque bombe aussi comme le temps avant explosion et la portée de l'explosion. Après en plus il y a l'animation des personnages à prendre en compte. Pour le SEED on peut s'en passer effectivement. Cependant ça ferait bien plus que 7*4 variables par frames, surtout en fin de partie où les joueurs peuvent poser 7-8 bombes chacun et les pousser dans tous les sens, ça devient ingérable. Bomberman est un jeu d'un extrême précision dans le gameplay et je ne vois pas d'autre solution que cette synchronisation un peu décalée.

Le pire c'est que mon multi marche sans erreur 90% du temps mais il arrive qu'un input de bouton A ne soit lu que par un joueur par exemple (et hop une bombe est posée mais lui peut passer à travers et se décale par rapport aux autres) et petit à petit tout se décale...

Si quelqu'un a une autre idée...

Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8924
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 19:18

Tu sais, même si t'envoyais chaque frame les coordonnées de tous tes objets in game, c'est ridicule.
Pour ce genre de jeu faut pas stresser a ce niveau.

Pour les bombes c'est bizarre. Tu devrais tenter de les re-synchro uniquement quand elles sont en mouvement.
En tout cas pas la peine de toute envoyer, faut juste envoyer ce qui est nécessaire a rendre les clients synchros au serveur.

Une solution pour les bombes serait de gérer l'explosion coté serveur et d'envoyer les infos au clients genre quand la bombe pète ou est poussé.
Enfin faut faire des tests, et aller au plus simple si possible car pas besoin de trucs dingues pour un bomberman :p

_________________
                 
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 19:59

A Oni : Par exemple pour ton Bomberman que tu as partagé comment tu gèrerais les choses que tu partages avec le serveur. J'ai tellement peu d'expérience en la matière que je ne sais pas à quel point ou peut partager ou pas les données.
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8924
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 20:15

Je pense que je ferait comme ça:

Si le joueur veut poser une bombe, il envoie un message au serveur.
Si pour le serveur, la bombe peut être posé par ce client, il envoie a tous les clients (celui qui a fait la demande aussi) un message qui fait créer une bombes aux coordonnées passées.

Si le joueur veux bouger une bombe, pareil.

Si une bombe explose, c'est uniquement coté serveur que ça se décide, et il envoie ensuite la notification aux clients.

Bref, faut voir la partie client comme une coquille vide, qui ne décide pour rien.
Toutes les décisions sont prises coté serveur, comme ça on s'assure que les clients sont en fait le reflet du serveur.

_________________
                 
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 20:42

Ok je comprends mais ça va être très compliqué du coup...

Pourquoi n'est-il pas possible d'imaginer un système qui récupère les inputs des joueurs, vérifie qu'il a les a tous reçu pour la frame courante, les renvoies et vérifie que les clients les ont reçu avant de passer à la frame suivante ? Un tel système est-il possible ?

Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 20:44

Ça te donne un temps de frame minimum égal au pire ping aller-retour entre les clients et le serveur... Ou comment se retrouver à 1.5 FPS si quelqu'un lagouille un peu :p

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 21:01

Effectivement, même avec un ping de 60ms on aura maxi 15-20 fps ça craint un peu...
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 21:06

Juste pour que je fasse me une idée, avec 60 fps, combien quelle quantité de données peut-on envoyer par frame sans saturer la bande passante ?
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 21:07

C'est pas si compliqué que ça Razz

Crée une fonction côté client send_to_server(buffer)
Une autre côté server send_to_all(buffer)

Quand le client clique pour placer une bombe, le buffer contient l'ID de l'action (Disons 243) qui tient dans un ubyte, avec les infos de positions, etc.
Le serveur le comprend, vérifie si le joueur a bien le droit (Pas trop loin, etc.) et si oui envoie aux clients la même ID (243) avec également sa position. Et de la tous les clients affichent une bombe.

Je sais pas si c'est vraiment la bonne manière mais ça marchera :p

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 21:22

Herdge a écrit:
Juste pour que je fasse me une idée, avec 60 fps, combien quelle quantité de données peut-on envoyer par frame sans saturer la bande passante ?

Beaucoup. Pour te donner une idée, le serveur ad hoc Minecraft que je fais tourner sur mon PC pour mapper avec un pote lui envoie une quinzaine de kio/s (soit 10% d'une bande passante un peu faible). Et avec tout le bordel de redstone qu'on a, ça en fait pas mal des infos qui passent.

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Lun 7 Juil 2014 - 21:26

Ha oui présenté comme ça a parait abordable. Dis moi Soundii t'aurais pas quelques exemples avec Faucet à m'envoyer (vu que t'as l'air plutôt à l'aise avec ça) ? Ca m'aiderait beaucoup à saisir la chose. Very Happy
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8924
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 7:39

Soundii a écrit:
Je sais pas si c'est vraiment la bonne manière mais ça marchera :p

Yep c'est la bonne manière, c'est ce que j'entendais par créer un protocole.

_________________
                 
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 7:49

Disons que je sais pas réellement comment faire plusieurs connexions en utilisant un même port, je me suis pas encore penché dessus ^^'

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 7:57

OK. Bon voici la nouvelle architecture à laquelle j'ai pensé suite à vos remarques, vous pourrez me dire si ça c'est plus réaliste et viable.

Les joueurs envoies toujours leur inputs sans les interpréter au serveur.

Le serveur les traite suivant le moteur du jeu.

Le serveur renvoies uniquement les données nécessaire pour dessiner le résultat. (x,y, image_speed, image_index, création de nouvel objet, destruction, état particulier...)

Les joueurs reçoivent ces données et les interprètent à travers de nouveaux objets créer spécialement pour les clients qui sont essentiellement lié à l'affichage (pas de calcul de collision ou autre...). (des versions "allégés des objets du serveur".

Ca parait bien ou je vais encore une fois dans le mur ? XD
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 8:01

En fait le serveur écoute sur un port, et dès qu'un client s'y connecte le socket fait une mitose, et tu conserves ton socket d'écoute tandis que le clone change de port et te sert à communiquer avec ce client en particulier. Le changement est transparent, et en général la fonction qui fait tout ça s'appelle accept(). Le but est que le port d'écoute du serveur soit connu et quasi toujours disponible (sauf le temps de spawner le socket client, normalement négligeable).

Edit @herdge : si je me souviens bien les premier jeux multi tournaient comme ça, ainsi que les RTS. C'est une très bonne économie de bande passante, mais ça a le problème d'introduire de la latence entre le joueur et son propre avatar, ce qui peut vite devenir désagréable.
Du coup on fait de l'avatar du joueur local un objet "lourd" capable de calculer ses mouvements, puis d'envoyer sa position au serveur. Le serveur valide la position (pas de TP dans tous les sens, merci !) puis la diffuse à tous les joueurs. Si la position n'est pas acceptable, le serveur resynchronise le client, souvent à sa position précédente (ce qui cause les "téléportations en arrière" quand le serveur est strict et que le client lagge beaucoup), ou selon une heuristique plus complexe pour estimer ce que le joueur a fait.

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
onilink_
Modérateur
avatar

Messages : 8924
Localisation : Montpellier
Projet Actuel : Planet Centauri
OniDev

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 8:12

Herdge a écrit:
OK. Bon voici la nouvelle architecture à laquelle j'ai pensé suite à vos remarques, vous pourrez me dire si ça c'est plus réaliste et viable.

Les joueurs envoies toujours leur inputs sans les interpréter au serveur.

Le serveur les traite suivant le moteur du jeu.

Le serveur renvoies uniquement les données nécessaire pour dessiner le résultat. (x,y, image_speed, image_index, création de nouvel objet, destruction, état particulier...)

Les joueurs reçoivent ces données et les interprètent à travers de nouveaux objets créer spécialement pour les clients qui sont essentiellement lié à l'affichage (pas de calcul de collision ou autre...). (des versions "allégés des objets du serveur".

Ca parait bien ou je vais encore une fois dans le mur ? XD

Ce système est pas mal et utilisé dans certain jeux (mais pas exactement sous cette forme), mais faut faire gaffe, y aura un petit temps de lag visuel pour chaque joueur, équivalent a 2x son ping.
Du coup, un gars avec une mauvaise connexion risque d'avoir un désavantage visuel certain, et se retrouver avec un perso qui a l'air d'avoir de l'inertie x)
Perso ce qui me paraîtrait plus classe, c'est de faire comme t'as dit, mais coté client ne pas juste envoyer les touches, mais aussi faire le déplacement.
Le serveur enverra ensuite le message de coordonnées, et si ton joueur est pas a la bonne position tu le recales.
Comme ça c'est smooth, et personne remarquera le tricks.

_________________
                 
Revenir en haut Aller en bas
Herdge
Très bonne participation
avatar

Messages : 164

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 8:15

Et pour ce qui est des bombes du coup ? Je le traite en local ou pas ? (ça me parait ingérable si ça passe pas d'abord par le serveur)
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 8:59

Oui les deux je pense. Le client fait une estimation et l'affiche, le serveur vérifie et si c'est correct il l'envoie aux autres joueurs.

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
D-z
Utilisateur confirmé: Rang *****
avatar

Messages : 1609
Localisation : Montpellier

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 9:00

Je ferais comme ça :

Le joueur appuie sur la touche "poser une bombe"
- Le client affiche une fausse bombe et envoie le message "bombe posée" au serveur
- Si le serveur refuse le placement (un autre joueur a posé une bombe là juste avant, ...), il retourne un message de refus. Le client supprime la bombe.
- Si le serveur accepte, il diffuse le message "bombe posée" à tous les clients. Tous les clients affichent une fausse bombe.
- C'est le serveur qui gère le décompte des bombes : lorsque celui-ci est terminé, il envoie le message "bombe explosée" à tout le monde, ainsi que les messages dégâts à ceux qui sont trop près.

_________________
 
Home is not a place, it's a feeling.
Revenir en haut Aller en bas
Asu
Utilisateur confirmé: Rang ****
avatar

Messages : 895

MessageSujet: Re: 39dll setsync()   Mar 8 Juil 2014 - 9:04

Bref, la loi numéro 1 du programmeur en networking, ne jamais faire confiance au client.

_________________
‎<‎Cysteine‎>‎ nON mais la touche maj s'active/se désactive toute seule
‎<‎Cysteine‎>‎ et a du mal à réponDRE QUANd j'appuie dessus
‎<‎Cysteine‎>‎ et je l'ai démont2? IL Ny a rien DEDANs
Revenir en haut Aller en bas
Contenu sponsorisé




MessageSujet: Re: 39dll setsync()   

Revenir en haut Aller en bas
 
39dll setsync()
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Forum Le CBNA :: Développement :: Entraide débutants-
Sauter vers: