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.


Messages - DexArio

Pages: [1] 2 Suivante »
1
J'ai joué un peu avec les transformations et j'ai fini par faire ça:

        float angle = -m_rotation * 3.141592654f / 180.f;
                float cosine = std::cos(angle);
                float sine = std::sin(angle);

                float x1 = m_scale.x * cosine;
                float y1 = m_scale.y * sine;
                float z1 = 0.f;
                float w1 = 0.f;
               
                float x2 = m_scale.x * -sine;
                float y2 = m_scale.y * cosine;
                float z2 = 0.f;
                float w2 = 0.f;

                float x3 = 0.f;
                float y3 = 0.f;
                float z3 = 1.f;
                float w3 = 0.f;

                float x4 = -m_rotationOrigin.x * x1 - m_rotationOrigin.y * -y1 + m_position.x + m_rotationOrigin.x * m_scale.x;
                float y4 = -m_rotationOrigin.x * -x2 - m_rotationOrigin.y * y2 + m_position.y + m_rotationOrigin.y * m_scale.y;
                float z4 = 0.0f;
                float w4 = 1.0f;


                m_mvp = glm::ortho(0.0f, (float)screenWidth, (float)screenHeight, 0.0f) *
                        glm::mat4(x1, y1, z1, w1, x2, y2, z2, w2, x3, y3, z3, w3, x4, y4, z4, w4);

Ce code est 2.4x plus rapide que l'ancien, c'est pas mal, mais c'est moins qu'SFML, qui est 6,4x plus rapide  :o
Cependant, il me reste d'autres optimisations à faire concernant d'autres fonctionnalités liées aux sprites.

2
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.

3
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.

4
Général / Re : Problème avec SFML OpenGL et glew
« le: Mars 22, 2015, 08:52:30 pm »
J'ai cherché et fait plusieurs appels de la fonction glGetString() dans mes deux projets (dans le projet SDL OpenGL qui marche et dans le projet SFML OpenGL qui ne marche pas et est le centre de cette discussion) et voici les résultats:

SDL OpenGL:
-glGetString(GL_VERSION) -> 4.4.0 NVIDIA 345.20
-glGetString(GL_EXTENSIONS) -> [Énormément]
-glGetString(GL_RENDERER) -> GeForce GTX 660ti/PCIe/SSE2
-glGetString(GL_VENDOR) -> NVIDIA Corporation

SFML OpenGL:
-glGetString(GL_VERSION) -> 1.1.0
-glGetString(GL_EXTENSIONS) -> GL_WIN_swap_hint GL_EXT_bgra GL_EXT_paletted_texture
-glGetString(GL_RENDERER) -> GDI Generic
-glGetString(GL_VENDOR) -> Microsoft Corporation

Les résultats sont très curieux et me laissent penser que le programme utilise la section graphique de mon processeur. Ce dernier est un Intel Core i7 3770k. Après, je ne suis pas sûr car je ne connais pas grand chose à OpenGL.

N'hésitez pas à me dire si vous voulez que je poste mon code en entier (il est petit) ou que je poste la configuration du linker.

5
Général / Re : Problème avec SFML OpenGL et glew
« le: Mars 22, 2015, 07:25:32 pm »
Oui, ma carte graphique supporte OpenGL 3.1 car, au début, je suivais le tuto avec la SDL et OpenGL 3.1 marchait. Cependant, quand je fais (dans mon projet SFML OpenGL)

       
std::cout << glGetString(GL_VERSION) << std::endl;
 

ça écrit: 1.1.0

Et dans mon projet SDL OpenGL la même ligne écrit: 4.4.0 NVIDIA 345.20

J'utilise aussi les mêmes API que celles utilisées pour le projet original SDL OpenGL (Glew, GLM, Freeglut).

J'ai une carte graphique Nvidia GeForce GTX 660ti, qui est assez récente.

6
Général / Re : Problème avec SFML OpenGL et glew
« le: Mars 22, 2015, 07:01:20 pm »
Ah oui, mince. Désolé si c'est un peu stupide mais je suis nouveau à OpenGL/Glew.. et je m’emmêle les pinceaux. J'ai donc initialisé Glew mais le problème persiste toujours. Voici mon code (le début):

        sf::ContextSettings settings;
        settings.majorVersion = 3;
        settings.minorVersion = 1;

        sf::RenderWindow window(sf::VideoMode(800, 600), "OpenGL", sf::Style::Default, settings);

        glewExperimental = GL_TRUE;
        GLenum initGlew = glewInit();
        //If the initialization failed
        if (initGlew != GLEW_OK)
        {
                std::cout << "Failed to initialize GLEW, error: " << glewGetErrorString(initGlew) << std::endl;
                return false;
        }

        glEnable(GL_DEPTH_TEST);
 

Normalement, Glew est bien initialisé car ça ne passe pas dans le if(initGlew !=GLEW_OK)

J'ignore à quoi sert glewExperimental mais j'ai vu sur internet qu'il fallait parfois le mettre. De toute façon, avec ou sans, l'erreur persiste.

Merci encore.

7
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.

8
Réseau / Re : Impossible d'extraire un char d'un paquet
« le: Février 14, 2015, 12:51:49 am »
Je dois avouer que j'ai été un peu fainéant sur ma dernière réponse, je m'en excuse, je vais aller faire mes recherches, merci pour tout !

9
Réseau / Re : Impossible d'extraire un char d'un paquet
« le: Février 13, 2015, 03:05:12 pm »
Est-ce que ça vous dérangerai de m'éclaircir un peu sur le 1., quelles sont les fonctions à utiliser ? si j'ai bien compris ce que vous me dites, il y a une façon de mettre le fichier directement dans le paquet et pas octet par octet.

Merci.

10
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.

11
Réseau / Re : Question concernant UDP et le client/serveur
« le: Décembre 22, 2014, 06:05:45 pm »
Effectivement, j'avais mal lu le tutoriel, je suis désolé. Merci !

12
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.

13
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.

14
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.

15
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.

Pages: [1] 2 Suivante »