Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - DexArio

Pages: [1]
1
Discussions générales / Rapidité des transformations avec SFML
« le: Mars 03, 2016, 10:35:38 pm »
Salut,

Je suis actuellement entrain de créer mes propres classes graphiques (= Sprites...) avec OpenGL. En comparant mes classes à celles d'SFML, j'ai remarqué que celles d'SFML étaient bien plus rapides (je parle ici des sprites). Après investigations, j'ai trouvé que calculer les transformations pour mes sprites prenait beaucoup de temps (j'utilise GLM). La différence est vraiment notable: j'ai fait une application test pour comparer et les résultats sont frappants: SFML -> 240 FPS, Moi -> 39 FPS. Quand J'enlève les transformations sur mes classes, je monte à 260 FPS. C'est donc le fait de calculer les transformations avec GLM qui cause énormément de lag. Je me demandais donc comment est-ce que SFML fait pour être aussi rapide. J'ai déjà épluché le code de sf::RenderTarger::draw(...) et de sf::Transformable::getTransform() mais mis à part le fait que SFML n'utilise pas GLM, je n'ai pas vu de différences notables (ex: SFML recalcule aussi les transformations à chaque fois qu'elles changent).

Je ne sais pas si c'est important mais voici comment est-ce que je calcule les transformations:

        if (m_updateNeeded)
        {
                glm::mat4 model, projection;

                /* Model matrix */
                /* Translating the sprite to its position and scaling it */
                model = glm::translate(model, glm::vec3(m_position.x, m_position.y, 0.0f));
                model = glm::scale(model, glm::vec3(m_scale.x, m_scale.y, 0.0f));

                /* Rotating the sprite (we translate it to its origin, rotate it and translate it back to where it was) */
                model = glm::translate(model, glm::vec3(m_rotationOrigin.x, m_rotationOrigin.y, 0.0f));
                model = glm::rotate(model, m_rotation, glm::vec3(0.0f, 0.0f, 1.0f));
                model = glm::translate(model, glm::vec3(-m_rotationOrigin.x, -m_rotationOrigin.y, 0.0f));

                /* Projection matrix */
                projection = glm::ortho(0.0f, (float)screenWidth, (float)screenHeight, 0.0f);

                m_mvp = projection * model;

                m_updateNeeded = false;
        }

        return m_mvp;

Sinon, pour le test que j'ai réalisé pour comparer marche de la manière suivante: j'ai un sprite de 32x32, que je draw() 768 fois (avec à chaque fois une position différente) pour couvrir une surface de 1024x768 px. Ainsi, les transformations doivent être recalculées 768 fois, ce qui crée beaucoup de lag avec mes classes.

(Aussi, je ne sais pas vraiment si ce topic est dans la bonne catégorie, de mon point de vue, je ne vois pas ça comme une demande d'aide mais plus comme une question, une inquisition).

Merci.

2
Système / Besoin d'aide concernant sf::Event::MouseWheelEvent
« le: Mai 30, 2015, 10:07:19 pm »
Bonjour,

J'utilise l'event MouseWheelEvent pour la première fois mais je galère un peu et j'aurais besoin de clarifications. Je m'explique: je suis entrain de programmer des objets pour faire des interfaces graphiques (genre boutons, textbox...) et en l'occurence, je suis entrain de faire une slide box. En gros, quand la souris de l'utilisateur est sur la slide box et que l'utilisateur fait tourner la molette, ça fait défiler les objets qui sont dans la slide box. J'utlise donc sf::Event::mouseWheel.delta. Le problème est que dans ce code ci:

        if (e->type == sf::Event::MouseWheelMoved)
                cout << e->mouseWheel.delta << endl;

quand je fais molette du haut, même juste une fois, ça cout toujours 1 jusqu'à ce qu'un autre event se produise, genre bouger la souris. En gros, la slide box défile à l'infini, même si j'ai fait bouger la molette qu'une fois et arrête que quand un autre event se produit.

En espérant avoir été assez clair dans mes explications,
Merci.

3
Général / Problème avec SFML OpenGL et glew
« le: Mars 22, 2015, 12:38:24 pm »
Bonjour,

Je suis entrain d'apprendre OpenGL en suivant ce tutoriel: http://openclassrooms.com/courses/developpez-vos-applications-3d-avec-opengl-3-3 sauf que celui ci utilise, en plus de OpenGL, la SDL. Cependant, préférant largement la SFML à la SDL, j'ai voulu dévier un peu du tuto et utiliser la SFML au lieu de la SDL. J'ai donc créé un nouveau projet et tout linké (J'utilise donc: SFML, GLEW, Freeglut). Cependant, glew ne semble pas fonctionner, quand j'appelle une fonction de glew (comme glIsShader ou glVertexAttribPointer, par exemple), le programme crash avec l'erreur suivante:

Unhandled exception at 0x751ECB49 in SFMLGL.exe: 0xC0000005: Access violation executing location 0x00000000.

J'ai donc cherché pendant plusieurs heures et j'ai remarqué que les fonctions qui font crash sont celles qui sont sous la forme (je le vois quand je fais clic droit -> go to definition)

#define glIsShader GLEW_GET_FUN(__glewIsShader)

Ce sont vraiment ces "types" de fonctions qui font crash. Au début de mon programme, j'appelle glEnable(GL_DEPTH_TEST) et ça ne crash pas. Quand je fais clic droit -> go to definition sur cette dernière fonction, je remarque qu'elle n'est pas sous la forme GLEW_GET_FUNC() mais
GLAPI void GLAPIENTRY glEnable (GLenum cap);

Sur internet, j'ai trouvé ce topic: http://stackoverflow.com/questions/15165863/glgenframebuffers-access-violation-when-using-glfw-glew

Ils disent que glew a des problèmes avec un "core OpenGL profile" je ne sais pas ce qu'est un core OpenGL profile mais je pense que c'est peut-être à cause de cela ou alors peut-être que il faut faire quelque chose de spécial pour pouvoir utiliser SFML OpenGL et glew.

Je ne sais pas si ça vient de SFML mais je viens ici car je ne sais vraiment plus quoi faire, merci.

4
Réseau / Impossible d'extraire un char d'un paquet
« le: Février 13, 2015, 02:25:55 pm »
Bonjour,

J'essaye de transmettre des fichiers avec TCP et je dois donc envoyer des char. Cependant, je n'arrive pas à les extraire.

Voici la fonction qui injecte un fichier dans un paquet (elle sera utilisée côté serveur, je n'ai pas pu la tester étant donné que mon problème fait que mon programme ne compile pas):

bool NetworkManager::AddFileToPacket(sf::Packet &p, string path)
{
   //Sources -> http://www.cplusplus.com/reference/cstdio/fread/ & http://en.sfml-dev.org/forums/index.php?topic=4709.0
   FILE *pFile;
   long size;


   pFile = fopen(path.c_str(), "rb");
   if (pFile == NULL)
   {
      fputs("File error", stderr);
      return false;
   }


   //Obtaining file size
   fseek(pFile, 0, SEEK_END);
   size = ftell(pFile);
   rewind(pFile);


   //Copying the file into the buffer
   vector<char> buffer;
   for (int i = 0; i < size; i++)
   {
      char* ch;
      fread(ch, 1, 1, pFile);
      buffer.push_back(*ch);


      delete ch;
      ch = 0;
   }


   //Injecting the vector into the packet
   p << static_cast<sf::Uint32>(buffer.size());
   for (vector<char>::const_iterator it = buffer.begin(); it != buffer.end(); it++)
   {
      p << *it;
   }


   //Closing the file
   fclose(pFile);


   return true;
}
 


Côté client, je dois extraire tout ça sauf que je ne peux pas extraire les chars:

//Extracting the vector from the packet
sf::Uint32 size;
p >> size;


vector<char> buffer;
for (sf::Uint32 i = 0; i < size; i++)
{
    char item;
    p >> item; //Error: no operator matches these operands. operand types are: sf::Packet >> char
    buffer.push_back(item);
}
NetworkManager::Instance().ReconstructFileFromBuffer(buffer, "data/file.txt");
 

Comme marqué dans les commentaires, l'erreur est la suivante: Error: no operator matches these operands. operand types are: sf::Packet >> char.

Je trouve cela bizarre qu'il soit possible d'injecter un char mais pas de l'extraire.

Merci.

5
Réseau / Question concernant UDP et le client/serveur
« le: Décembre 22, 2014, 05:27:53 pm »
Bonjour, je suis entrain de créer un jeu en multijouer avec une architecture client/serveur, le serveur doit gérer plusieurs clients. J'utilise 1 thread par client ainsi que les protocoles UDP et TCP. J'ai fini de programmer tout ce qui concerne TCP, ça marche très bien, je dois maintenant programmer la communication avec UDP, donc pouvoir recevoir et envoyer des paquets (je ne parle que du serveur pour l'instant). Mon problème est que je ne vois pas trop comment faire pour recevoir des paquets avec UDP. Pour TCP, il suffit de faire socket.receive() et on reçoit tout ce qui vient des clients mais avec UDP, on doit indiquer l'ip et le port du client à recevoir, je ne comprends pas trop comment je dois faire. Comment est-ce que je fais pour recevoir tout ce qui vient sur un port avec UDP ? Je précise que j'utilise 1 socket UDP pour le serveur et non pas 1 par client car j'ai cru comprendre que l'on pouvait faire comme ça. Merci.

6
Système / Threads - Utiliser std::bind dans une classe
« le: Novembre 01, 2014, 03:33:00 pm »
Bonjour,

Je me demandai si il était possible d'utiliser std::bind pour les theads dans une classe. Ce code clarifiera ma question:


class MyClass
{
    MyClass();
    ~MyClass();

    void Start()
    {
        thread = new sf::Thread(std::bind(&MyClass::Func, 0));
        thread->launch();
    }
    void Func(int arg1)
    {
        //Some code
    }

private:
    sf::Thread *thread;
};
 

Le code n'est pas complet, c'est juste un exemple, mais dans mon vrai code, j'ai fait l'équivalent de cela mais le problème est que j'ai l'erreur suivante (sous Visual Studio)

error C2064: term does not evaluate to a function taking 1 arguments

Bref, ce que je veux faire, c'est exécuter une méthode prenant un argument avec avec un thread dans une classe.

Merci.

7
Système / [Résolu] Problème avec les threads
« le: Août 29, 2014, 10:53:24 am »
Bonjour,

Je travaille actuellement sur un petit jeu en réseau, utilisant une architecture client/serveur et le protocole TCP. Mon problème vient de la partie serveur: j'utilise un thread par client mais le problème vient du fait que lorsque je lance un nouveau thread de client (lorsque il y a une nouvelle connexion, car j'utilise un thread par client pour communiquer), il est automatiquement arrêté car il est stocké dans un vector et comme stipulé dans lu tutoriel concernant les threads, si un thread n'a plus son instance, il est détruit. Je stocke mes threads dans un vector car le nombre de joueurs est variable, je pense que le problème vient de là, mais du coup, je me demande comment stocker des threads sans qu'ils soient détruits. Voici mon code:

Voici le vector:

vector<ClientThread*> clientThreads;

La structure ClientThread:

struct ClientThread
{
   int playerID;
   sf::Thread *commThread; //Communication thread
};

Et la fonction Listen() qui s'occupe d'écouter sur un certain port et de gérer les nouvelles connexions (donc de lancer les ClientThreads). Cette fonction n'est pas exécutée dans le main thread mais dand un autre thread. J'ai essayé de garder l'essentiel.

void Listen()
{
   sf::TcpListener listener;

   if (listener.listen(port) != sf::TcpListener::Done)
   {
      cout << "Error while attempting to listen on port " << port << endl;
      error = true;
      return;
   }

   int idCounter = 0;

   while (!stop)
   {
      //If the server is full, we will not accept more clients
      if (clients.size() > 3)
      {
         while (clients.size() > 3)
            Sleep(100);
      }

      Client client;

      listener.accept(client.socket);
      cout << "Initializing new client..." << endl;
      client.ID = idCounter;
      clients.push_back(&client);

      /*Du code pas important...*/

   next:;
      //Launching communication thread
      clientThreads.push_back(new ClientThread());
      clientThreads[clientThreads.size() - 1]->playerID = idCounter;
      clientThreads[clientThreads.size() - 1]->commThread = new sf::Thread(&Communicate, idCounter);
      clientThreads[clientThreads.size() - 1]->commThread->launch();

      idCounter++;
      cout << "New client successfuly connected" << endl;
   }
}

Voici comment sont stockés les clients:

vector<Client*> clients;

Et la structure:

struct Client
{
   sf::TcpSocket socket;
   int ID;
   string color;
   sf::Vector2i counterPos;
};
 
Et voici la fonction Communicate, qui sert à communiquer avec le client:

void Communicate(int id)
{
   sf::Packet p;

   //Sending connection info
   p << GetClientWithID(id)->color << GetClientWithID(id)->counterPos.x << GetClientWithID(id)->counterPos.y;
   GetClientWithID(id)->socket.send(p); //<-------- Ce packet est bien envoyé

   p.clear();

   while (!stop)
   {
      if (GetClientWithID(id) == NULL)
         return;

      if (GetClientWithID(id)->socket.receive(p) != sf::Socket::Done) //<----------- Perte de connexion ici, avec sf::Socket::Error
      {
         cout << "Client " << id << " lost connection" << endl;
         RemoveClientWithID(id);
         return;
      }
      else
      {
         BroadcastPacket(p, id);
         p.clear();
      }
   }
}

Remarquez les commentaires que j'ai mis qui stipulent où est l'erreur et où elle n'est pas.

Je tiens à préciser que tout le code est contenu dans un seul fichier Main.cpp. Les vectors sont donc des variables globales. Ce n'est pas très propre mais à vrai dire, je ne pensais pas que le serveur allait être aussi gros (il n'y a pas que ça comme code) donc j'ai fait comme cela et je me rends compte que je me suis un peu planté sur ce point. Mais au moins, la prochaine fois, je le saurai et je ferai quelque chose de plus propre.

Merci.

8
Graphique / Charger les sprites dans la carte graphique
« le: Août 10, 2014, 10:52:19 pm »
Bonjour,

Je suis entrain de créer un jeu et j'ai récemment rencontré des problèmes de performances: le jeu tourne à environ 20 FPS alors que je vise les 60 FPS. Je pense que le problème vient du fait que les sprites sont dans la RAM, qui est lente. C'est pourquoi je me demandais si il était possible de charger les sprites dans la mémoire de la carte graphique, qui est plus rapide. Si je me plante totalement sur un point, faites le moi savoir.

Merci.

9
Réseau / TcpSocket détecté comme "Disconnected" alors que non
« le: Mai 04, 2014, 09:19:37 pm »
Bonjour,

Je suis entrain de faire un mini jeu en réseau avec une architecture Client/Serveur. Voici mon code, côté serveur:

int main()
{
        int nbClients;

        sf::TcpListener listener;
        sf::TcpSocket c1, c2;

        sf::Packet p, p2;

        short port = 1601;

        listener.listen(port);

reload:

        std::cout << "Server launched on port " << port << ", waiting for connections..." << std::endl;

        listener.accept(c1);
        std::cout << "A client has connected, sending a packet to him..." << std::endl;
        p << "Succesfully connected" << "wait";
        c1.send(p);
        p.clear();

        listener.accept(c2);
        std::cout << "A client has connected, sending a packet to him..." << std::endl;
        p << "Succesfully connected" << "launch";
        c2.send(p);
        p.clear();
        p << "launch";
        c1.send(p);
        p.clear();

        while (true)
        {
                if (c1.Disconnected && !c2.Disconnected)
                {
                        p << "shut";
                        c2.send(p);
                        c2.disconnect();
                        p.clear();

                        std::cout << "A client has disconnected, reloading server..." << std::endl;
                        goto reload;
                }
                if (c2.Disconnected && !c1.Disconnected)
                {
                        p << "shut";
                        c1.send(p);
                        c1.disconnect();
                        p.clear();

                        std::cout << "A client has disconnected, reloading server..." << std::endl;
                        goto reload;
                }
                if (c1.Disconnected && c2.Disconnected)
                {
                        c1.disconnect();
                        c2.disconnect();

                        std::cout << "Clients have disconnected, reloading server..." << std::endl;
                        goto reload;
                }

                c1.receive(p);
                c2.receive(p2);

                std::cout << "Data Received, sending it..." << std::endl;

                c1.send(p2);
                c2.send(p);
               
        p.clear();
        p2.clear();
        }

        return 0;
}
 

Le problème est que dès que le thread entre dans la while loop, il entre directement dans "if (c1.Disconnected && c2.Disconnected)" et ressort de la loop, alors que les deux clients ne se sont pas déconnectés. Par contre, j'ai remarqué que une fois connecté au serveur, windows affiche que le client ne répond pas alors qu'il répond parfaitement (le jeu marche). Si vous voulez du code côté client, dites le moi.

Pages: [1]