Partage
  • Partager sur Facebook
  • Partager sur Twitter

[OpenGL] Ralentissements...

Mais pas tout le temps!

    17 mai 2006 à 19:30:57

    Salut!
    Voilà j'ai créé une pièce en 3D avec OpenGL dans laquelle on peut se déplacer (flèches) et tourner la caméra (souris).

    Si je ne me déplace pas mais que je regarde autour de moi: tout est normal.
    Mais dès que je bouge, le programme ralentit o_O
    Et plus je me déplace... plus le programme ralentit! Jusqu'à mettre plusieurs secondes à répondre...

    Je sais que je vais peut être un peu trop vite vis à vis du cours, mais bon, je suis trop impatient :p

    Voilà le main (je sais qu'il y a surement du C mélangé avec le C++ et que c'est pas bien, mais je programme en C... et je crois qu'il y a besoin de C++ por la POO après d'après ce que j'ai compris)

    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
    #include <SDL/SDL_ttf.h>
    #include <GL/glu.h>
    #include <GL/gl.h>

    #include "sdlglutils.h"
    #include "main.h"
    #include "const.h"

    int main (int argc, char* argv[])
    {
        SDL_Init(SDL_INIT_VIDEO);
        SDL_WM_SetCaption("Test OpenGL !",NULL);
        SDL_SetVideoMode(WSCREEN, HSCREEN, 32, SDL_OPENGL);
        SDL_ShowCursor(SDL_DISABLE);
        TTF_Init();
        text_data text = createText("arial.ttf", 30, "essai de texte!", 255, 255, 0);

        bool continuer = true;
        SDL_Event event;
        int tps_actuel = 0;
        int tps_ancien = 0;
        cam cam = {0, 0, 0.8, 0, 0};

        //textures
        textures textures;
        textures.floor  = loadTexture("floor004.jpg");
        textures.tapis  = loadTexture("object001.jpg");
        textures.wall   = loadTexture("brick001+.jpg");
        textures.door   = loadTexture("door045.jpg");
        textures.front  = loadTexture("object003_front.jpg");
        textures.side   = loadTexture("object003_side.jpg");

        glEnable(GL_DEPTH_TEST);

        glEnable(GL_TEXTURE_2D);

        while (continuer)
        {
            tps_actuel = SDL_GetTicks();
            if(tps_actuel-tps_ancien < EXECDELAY)
                SDL_Delay(EXECDELAY-(tps_actuel-tps_ancien));
            tps_ancien = tps_actuel;

            SDL_PollEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = false;
                    break;
                case SDL_MOUSEMOTION:
                    cam.a += (event.motion.x-400.0)/500.0;
                    cam.b -= (event.motion.y-300.0)/500.0;
                    if(cam.a > 360)
                        cam.a = cam.a - 360;
                    else if (cam.a < -360)
                        cam.a = cam.a + 360;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_DOWN:
                            cam.y -= 0.1*cos(cam.a);
                            cam.x -= 0.1*sin(cam.a);
                            break;
                        case SDLK_UP:
                            cam.y += 0.1*cos(cam.a);
                            cam.x += 0.1*sin(cam.a);
                            break;
                        case SDLK_RIGHT:
                            cam.y += 0.1*(cos(cam.a+90));
                            cam.x += 0.1*(sin(cam.a+90));
                            break;
                        case SDLK_LEFT:
                            cam.y += 0.1*(cos(cam.a-90));
                            cam.x += 0.1*(sin(cam.a-90));
                            break;
                        case SDLK_SPACE:
                            break;
                        default:
                            break;
                    }
            }
            SDL_WarpMouse(400,300);
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            gluPerspective(70,(double)WSCREEN/HSCREEN,1,1000);

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glMatrixMode(GL_MODELVIEW);
            glLoadIdentity();
            gluLookAt(  cam.x, cam.y, cam.z, //pos
                        cam.x+sin(cam.a), cam.y+cos(cam.a),cam.z+sin(cam.b), //look
                        0,0,1);

            displayFloor(&textures);
            displayWall(&textures);
            displayDoor(&textures);
            displayDistrib(&textures);
            printText(&text, 10, 10);

            glFlush();
            SDL_GL_SwapBuffers();

        }

        SDL_Quit();

        return 0;
    }


    Si quelqu'un pouvait m'expliquer!
    Merci d'avance (ou par avance? :-° )
    • Partager sur Facebook
    • Partager sur Twitter
      17 mai 2006 à 19:46:52

      Héhé je pourrai t'aider à la limite mais non :)
      Comme c'est le prochain chapitre prévu et qu'en plus je suis en plein exam, je veux pas perdre du temps à débugger qq chose qui de toute facon reste à expliquer clairement (sacré boulot).

      Bon courage.
      • Partager sur Facebook
      • Partager sur Twitter
        17 mai 2006 à 19:50:09

        Ok je comprends lol
        Je pars sur de bonnes bases ou c'est pas du tout comme ca qu'on fera dans le chapitre?
        Sinon j'attend le prochain avec encore plus d'impatience...
        Kayl: maître du suspense :D
        • Partager sur Facebook
        • Partager sur Twitter
          17 mai 2006 à 19:56:20

          Je suis pas maitre du suspense j'ai juste une vie qui s'avère etre ennuyeuse en ce moment :)
          La seule chose que je peux te dire c'est que nous ferons les choses plus proprement (ton code me fait peur :p )).
          • Partager sur Facebook
          • Partager sur Twitter
            17 mai 2006 à 20:18:28

            Ok merci pour ces réponses-éclair!
            Je suis sur une autre piste qui consiste à déplacer le repère au lieu de la caméra, mais ca a aussi l'air de ramer...
            Enfin je te laisse, je vais pas te déranger plus, j'attends le prochain chapitre sans reposer de questions, promis!

            Merci encore ;)
            • Partager sur Facebook
            • Partager sur Twitter
              17 mai 2006 à 20:38:40

              cos() et sin() ? Je sèche... Je lirai sans doute le prochain chapitre :p

              Au fait : tu utilises des Display Lists ?
              • Partager sur Facebook
              • Partager sur Twitter
                17 mai 2006 à 20:47:20

                Euh c'est quoi les display lists?
                Et cos et sin ce sera pas dans le prochain chapitre c'est les fonctions mathématiques cosinus et sinus :p
                • Partager sur Facebook
                • Partager sur Twitter
                  17 mai 2006 à 20:58:43

                  Ca scene est pas complexe pas besoin de display list.
                  On verra les display list lorsque nous ferons un terrain 3D (car là le nombre de poly va vite monter).

                  Perso je ne fais pas gèrer le mouvement sur le sdl_event des touches.
                  Je mets un booleen sur le sdl_event, et je fais un mouvement qui depend du temps ET du booleen.

                  Edit bon je vous montre un truc mais vous me tapez pas hein :p (ce sont des préparatifs pour un chapitre à venir (lighting) et un chapitre bcp plus loin (shaders) :
                  - http://illament.free.fr/sdz/lighting.jpg
                  - http://illament.free.fr/sdz/toon_shader.jpg

                  Edit : m'en veuillez pas, ça me prend moins de temps de faire mumuse que de rédiger un tuto. Puis c'est tellement fun ! :) J'ai hate de vous faire découvrir tout ça.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 mai 2006 à 21:14:38

                    ca cartonne :D
                    allez rédige nous ca plus vite :D
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [OpenGL] Ralentissements...

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown