Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon programme est lent

trop de chose à faire?

    12 avril 2006 à 19:06:45

    Bonjours à tous!

    Je suis en ce moment sur un programme où zozor doit éviter des blocs noirs qui lui arrive dessus. Pour détruire les blocs il peut lancer des lasers.

    Après beaucoup déssais j'ai réussi à tester les collisions entre les lasers et les blocs. Seulement voilà mon programme et tréééééééééééééés lent. Je pense qu'il doit téster trop de chose pour voir les collisions.

    Comme je ne suis surement pas très claire voici mon code:

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>



     

    int main(int argc, char *argv[])
    {
        srand(time(NULL));
    long x = 0;
    long up = 0;
    long down = 0;
    long left = 0;
    long right = 0;
    long nombreCube = 0;
    long MIN = 0;
    long MAX = 450;
     long lass = 0;
        long a = 1;
        SDL_Surface *ecran = NULL, *zozor = NULL, *cube = NULL, *cube2 = NULL, *laser = NULL;
        SDL_Rect positionFond;
       positionFond.x = 10;
        positionFond.y = 10;
    long temps = SDL_GetTicks();
    long i = 0;
    long ii = 0;
     long t = 0;
     long tt = 0;

       long las = 0;

    SDL_Rect positionCube;

        positionCube.x = 0;
        positionCube.y = (rand() % (MAX - MIN + 1)) + MIN;
        i = 0;
       
           positionCube.x = 0;
           positionCube.y = (rand() % (MAX - MIN + 1)) + MIN;     
        SDL_Rect positionCube2;

        positionCube2.x = 0;
        positionCube2.y = (rand() % (MAX - MIN + 1)) + MIN;
        i = 0;
       
           positionCube.x = 0;
           positionCube.y = (rand() % (MAX - MIN + 1)) + MIN; 
         i = 0;
         SDL_Rect positionLaser[500];
        positionLaser[500].x = 1;
        positionLaser[500].y = 1;   
        SDL_Init(SDL_INIT_VIDEO);
      SDL_Event event;
       ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_FULLSCREEN );
        SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
        i = 0;
       
       
        cube = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
        cube2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
       
         i = 0;
         laser = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 4, 32, 0, 0, 0, 0);
         SDL_FillRect(cube, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
         SDL_FillRect(cube2, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
          SDL_FillRect(laser, NULL, SDL_MapRGB(ecran->format, 255, 0, 0));
             SDL_BlitSurface(cube, NULL, ecran, &positionCube);
             SDL_BlitSurface(cube2, NULL, ecran, &positionCube);
        /* Chargement d'une image Bitmap dans une surface */
        zozor = SDL_LoadBMP("zozor.bmp");
        /* On blitte par-dessus l'écran */
        SDL_BlitSurface(zozor, NULL, ecran, &positionFond);
    SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));
    SDL_EnableKeyRepeat(10, 10);
     SDL_Flip(ecran);
    SDL_ShowCursor(SDL_DISABLE);
    i = 0;
    while(i != 501)
    {
    positionLaser[i].x = 10000;
    i++;
    }
    while(i != 501)
    {
    positionLaser[i].y = 10000;
    i++;
    }
    while(a)
    {
    i = 0;
    ii = 0;
    t = 0;
    tt = 0;
    x = 0;
    while(x != 500)
    {
    tt = 0;
    while(tt != 20)
    {
    t = 0;
    while(t != 4)
    {
    ii = 0;
    while(ii != 20)
    {
    i = 0;
    while(i != 20)
    {
    if(positionCube.x + i == positionLaser[x].x + tt && positionCube.y + ii == positionLaser[x].y + t)
    {
    positionCube.x = 0;
    positionCube.y = (rand() % (MAX - MIN + 1)) + MIN;
    }
    i++;
    }
    ii++;
    }
    t++;
    }
    tt++;
    }
    x++;
    }

    x = 0;
    i = 0;
    ii = 0;
    t = 0;
    tt = 0;
    while(x != 500)
    {
    tt = 0;
    while(tt != 20)
    {
    t = 0;
    while(t != 500)
    {
    ii = 0;
    while(ii != 20)
    {
    i = 0;
    while(i != 20)
    {
    if(positionCube2.x + i == positionLaser[x].x + tt && positionCube2.y + ii == positionLaser[x].y + t)
    {
    positionCube2.x = 0;
    positionCube2.y = (rand() % (MAX - MIN + 1)) + MIN;
    }
    i++;
    }
    ii++;
    }
    t++;
    }
    tt++;
    }
    x++;
    }
    i = 0;
    ii = 0;
    t = 0;
    tt = 0;
    x = 0;
    if(positionCube.x == 640)
    {
    positionCube.x = 0;
    positionCube.y = (rand() % (MAX - MIN + 1)) + MIN;
    }
    if(positionCube2.x == 640)
    {
    positionCube2.x = 0;
    positionCube2.y = (rand() % (MAX - MIN + 1)) + MIN;
    }

    i = 0;
    if(i < las)
    {
    while(i != las )
    {

      if(positionLaser[i].x != 0)
      {
      positionLaser[i].x--;
      positionLaser[i].x--;
      SDL_BlitSurface(laser, NULL, ecran, &positionLaser[i]);
      }
      else
      {
          positionLaser[i].y = 1500;
      }
    i++;
    }
    }
      i = 0;
    positionCube.x++;
    positionCube.x++;
    positionCube.x++;
    positionCube.x++;
    positionCube2.x++;
    positionCube2.x++;
    positionCube2.x++;
    positionCube2.x++;
    i = 0;
    SDL_Flip(ecran);
    SDL_PollEvent(&event);
      switch (event.type)
      {
        case SDL_QUIT:
             a= 0;
             break;
        case SDL_KEYDOWN:
        switch(event.key.keysym.sym)
        {
        case SDLK_UP:
           up = 1;
          break;
        case SDLK_DOWN:
           down = 1;
           break;
        case SDLK_LEFT:
           left = 1;
             break;
           case SDLK_RIGHT:
           right = 1;
          break;
            case SDLK_a:
           a = 0;
          break;
          case SDLK_g:
           lass = 1;
           break;
          case SDLK_t:
          t--;
          SDL_SetAlpha(zozor, SDL_SRCALPHA, t);
          break;
         
           }
     
     break;
        case SDL_KEYUP:
             switch(event.key.keysym.sym)
             {
               case SDLK_UP:
           up = 0;
          break;
        case SDLK_DOWN:
           down = 0;
           break;
        case SDLK_LEFT:
           left = 0;
             break;
           case SDLK_RIGHT:
           right = 0;
          break;
          case SDLK_g:
           lass = 0;
           break;
           }
        break;
        case SDL_MOUSEMOTION:
           
           
            positionFond.y = event.motion.y;
            positionFond.x = event.motion.x;
           
    }
       
         SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
         SDL_BlitSurface(zozor, NULL, ecran, &positionFond);
          i = 0;
         
           SDL_BlitSurface(cube, NULL, ecran, &positionCube);
           SDL_BlitSurface(cube2, NULL, ecran, &positionCube2);
         SDL_Flip(ecran);

    if(up == 1)
    positionFond.y--;
    if(down == 1)
    positionFond.y++;
    if(right == 1)
    positionFond.x++;
    if(left == 1)
    positionFond.x--;
    if(lass == 1)
     {
    if(SDL_GetTicks() > (temps + 100))
          {
             if(las != 501)
           {
          positionLaser[las].x = positionFond.x;
          positionLaser[las].y = positionFond.y + 40;
          las++;
          SDL_BlitSurface(laser, NULL, ecran, &positionLaser[las]);
          }
          if(las == 501)
          las = 0;
     }
              temps = SDL_GetTicks();
          }

    }
        SDL_Flip(ecran);


        SDL_FreeSurface(zozor); /* On libère la surface */
        SDL_Quit();

        return EXIT_SUCCESS;
    }

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      12 avril 2006 à 19:34:19

      :waw::waw::waw: Comment tu veux qu'on comprenne ce code ? Aucune indentation, aucune fonction, des variables partout, très peu de commentairs (inutiles en plus)... T'as sans doute un blit ou une création de surface dans une boucle qui se répète. Ou alors c'est que ta partie collision est trop mal faite, mais là j'arrive pas à reconnaître où se passe la gestion des collisions :D
      • Partager sur Facebook
      • Partager sur Twitter
        12 avril 2006 à 19:37:43

        o_O comprend pas pourquoi tu mets ta variable i à 0 autant souvent ..


        positionCube.x = 0;
            positionCube.y = (rand() % (MAX - MIN + 1)) + MIN;
            i = 0;

        /* et juste après */

        positionCube2.x = 0;
            positionCube2.y = (rand() % (MAX - MIN + 1)) + MIN;
            i = 0;

        /* Et encore */

        i = 0;
           
           
            cube = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
            cube2 = SDL_CreateRGBSurface(SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
           
             i = 0;


        :-° Soit j'ai manqué qqch , soit j'ai rien compris à ce que tu a fais

        Edit : Tu pourrais simplifier sa au moins :-°


        positionCube.x++;
        positionCube.x++;
        positionCube.x++;
        positionCube.x++;

        positionCube2.x++;
        positionCube2.x++;
        positionCube2.x++;
        positionCube2.x++;

        /* positionCube.x + = 4  Serait mieux pour la fluidité non ?   */
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          12 avril 2006 à 19:42:25

          Hum j'avais pas remarqué le i à 0 plusieurs fois, mais c'est pas ce genre de choses qui ralentit un programme SDL (edit : les ++ non plus, comparé au reste du code c'est un détail :D ), c'est les grosses boucles ou l'abus se sufaces et tout...

          Enfin moi à ta place je recommencerai tout le code :D
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            12 avril 2006 à 20:06:40

            Citation : louisclem

            très peu de commentairs (inutiles en plus)



            En plus le peu de commentaires ressemblent étrangement à ceux que matéo met dans les exemples du cours :)
            • Partager sur Facebook
            • Partager sur Twitter
              12 avril 2006 à 20:08:23

              euh ya déja plusieurs incohérences :

              i = 0;
              while(i != 501)
              {
              positionLaser[i].x = 10000;
              i++;
              }
              while(i != 501)
              {
              positionLaser[i].y = 10000;
              i++;
              }


              Une fois sorti de la premiere boucle i vau 501 donc il sautera toujours la deuxieme boucle. Quelle est son utilitée ?

              EDIT : je remarque beaucoup de long .. c'est pas inutile ? des int suffiraient amplement (en tout cas rien que pour "a" qui a l'air d'etre ton equivalent de "continuer" des cours.
              • Partager sur Facebook
              • Partager sur Twitter
                12 avril 2006 à 20:10:53

                o_O et en plus je viens de remarquer que te répète énormément, c'est à rien n'y comprendre ..



                DL_Rect positionCube;

                    positionCube.x = 0;
                    positionCube.y = (rand() % (MAX - MIN + 1)) + MIN;
                    i = 0;
                   
                       positionCube.x = 0;
                       positionCube.y = (rand() % (MAX - MIN + 1)) + MIN;     
                    SDL_Rect positionCube2;

                    positionCube2.x = 0;
                    positionCube2.y = (rand() % (MAX - MIN + 1)) + MIN;
                    i = 0;
                   
                       positionCube.x = 0;
                       positionCube.y = (rand() % (MAX - MIN + 1)) + MIN;
                     i = 0;

                /* Tu modifies 3 fois la position de ton cube  o_O  */


                Tu pourrais alléger ton code facilement :)
                Mets des commentaires, des noms de variables clairs et surtout indente un peu ton fichier de temps en temps ^^

                ;) Je suis sur que même toi tu t'y retrouvera mieux
                • Partager sur Facebook
                • Partager sur Twitter
                  12 avril 2006 à 20:21:20

                  Juste un question et si ton programme bug a la ligne 125 en plein milieu d'un super fonction que tu a codé le jour avant et que avec le grand nombre de commentaire tu comprenne plus rien tu va faire comment? avant de demandé pourquoi le programe est lent cherche a le simplifier crée des fonctions
                  par exemple une fonction aleatoire ca sera toujours mieu ke de retaper une dixaine de fois la commande rand avec tout le bazar derrière. Une fois que tu a partagé ton code en fonction, avec plein de fichier, les header et les .c ben tu cherche a amélioré le code comprendre qu'est ce que fait exactement tel fonction si on peu la racoursir, utilisé moins de variables .... Bon allé je te laisse et ammuse toi bien.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 avril 2006 à 20:27:52

                    :) j'ai trouvé autre chose que ne joue pas dans ton programme, tu ne libère pas les surfaces en fin de programme. Tu ne libères que zozor

                    Il faut aussi mettre :


                    SDL_FreeSurface(cube);
                    SDL_FreeSurface(cube2);
                    SDL_FreeSurface(laser);



                    Edit : o_O J'ai testé ton programme chez moi .. c'est absolument impossible à utiliser. Je l'ai tester 2 fois et j'ai du a chaque fois faire ctrl+alt+suppr pour arriver a quitter :-°

                    :euh: Il doit y avoir qqch de vraiment faut la dedans ...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 avril 2006 à 22:00:10

                      ET en faisant une fonction a laquelle tu passes les surfaces en paramètre? Ce serait déjà plus compréhensible non?
                      J'ai pas lu ton code dsl pas eu le courage lol
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Mon programme est lent

                      × 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