Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Mauvaise gestion des Socket (Jeu vidéo)  (Lu 2328 fois)

0 Membres et 1 Invité sur ce sujet

Despirithium

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Mauvaise gestion des Socket (Jeu vidéo)
« le: Juin 24, 2014, 08:07:25 pm »
Bonjour,
Voilà, j'attaque la partie réseau de mon programme.
Mon jeu se déroule ainsi : un joueur fait office de serveur et le second tente de se connecter au premier.
Jusqu'ici, aucun problème, les menus fonctionnent correctement, le client parvient à se connecter au serveur et j'ai réalisé un envoi de packet (de type Fighter, une classe personnalisée) qui fonctionne très bien.

Néanmoins lorsqu'il s'agit de réaliser la partie, je ne sais pas très bien pourquoi, mais les données ne se mettent pas à jour, les packets ne sont pas correctement reçus. De plus, le jeu est très lent.
C'est la première fois de ma vie que je touche à du réseau, je vous présente le code concerné.

Boucle Principale :
    while(mWindow->isOpen())
    {
        processEvents();
        timeSinceLastUpdate += clock.restart();

        while(timeSinceLastUpdate > TimePerFrame)
        {
            processEvents();
            update(TimePerFrame);
            checkCollider();
            updateOnline();
            render();

            if(mMoving[ESCAPE])
            {
                mMoving[ESCAPE] = false;
                mType = -1;
                return;
            }
        }
    }
 

La fonction UpdateOnline :
   if(mType != LAUNCHGAMEONLINE)
        return;

    mLastOnlineTry.restart();

    sf::Packet sending, receiving;

    sending << mCurrentFighter;

    mOnlineManager->send(sending);
    receiving = mOnlineManager->receive();

    receiving >> *(mOpponentFighter);
 

Les fonctions send et receive de la classe OnlineManager :
void OnlineManager::send(sf::Packet p)
{
    if(!mConnected)
        return;

    while(mSocket.send(p) != sf::Socket::Done);
}

sf::Packet OnlineManager::receive()
{
    sf::Packet p;

    if(!mConnected)
        return p;

    while(mSocket.receive(p) != sf::Socket::Done);

    return p;
}
 

Voilà. Le jeu est très lent (sans doute à cause des boucles je suppose) et en plus de ça, les données ne sont pas reçues côté client ni serveur..
Merci de m'avoir lu.
Cordialement !

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Mauvaise gestion des Socket (Jeu vidéo)
« Réponse #1 le: Juin 24, 2014, 08:27:09 pm »
Citer
while(mSocket.receive(p) != sf::Socket::Done);
Tu voulais faire quoi avec cette ligne de code ?

Est-ce que tu as lu le(s) tutoriel(s) réseau ? Ils présentent les trois choix standard en métière de gestion des sockets :
1. un thread par client
2. un thread pour tous les clients + un sélecteur
3. pas de thread supplémentaire, sockets non-bloquantes

Sans entrer dans les détails du code, peux-tu commencer par nous décrire la solution que tu as choisi pour ton jeu ?
Laurent Gomila - SFML developer

Despirithium

  • Newbie
  • *
  • Messages: 17
    • Voir le profil
Re : Mauvaise gestion des Socket (Jeu vidéo)
« Réponse #2 le: Juin 24, 2014, 08:46:16 pm »
Ma manière de traiter le problème est la suivante :
Dans la boucle du jeu principale, à chaque tour, j'appelle la fonction updateOnline qui vérifie si le mode online est activé (ce qui a suscité auparavant une connexion entre le client et le serveur dans les Menus du jeu).
Une fois la vérification faite, on envoi les données à travers le socket qui sert de liaison, puis on en reçoit à travers le même socket. Le packet reçu mets à jour le joueur adverse non contrôlé par le joueur actuel (mOpponentFighter, qui est un pointeur de fighter).

La boucle signifie juste que, tant que les données ne sont pas complètement reçues, on continue de les recevoir. Je me suis peut-être trompé dans la manipulation, je bossais avec Qt il y a un long moment et il fallait à chaque tour vérifier si toutes les données étaient bien arrivées.

J'ai vaguement eu l'idée des thread, mais vu que je viens à peine de toucher au réseau et que je connais à peine les threads, je savais pas si c'était une bonne idée. Merci de la suggestion :)
« Modifié: Juin 24, 2014, 09:28:31 pm par Despirithium »