Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C/SDL] Bien utiliser la mémoire.

Dans un exmple précis :)

Sujet résolu
    28 mai 2006 à 19:47:23

    Salut, saloute ! C'est moi et encore pour un sujet concernant la lourdeur des programmes.
    J'ai bien compris qu'il ne faut pas mettre des instructions "lourdes" (comme charger une surface de texte) dans une boucle while (et précisement la boucle while dite principale, celle qui gère les évenements.)

    Seulement voilà ... cette fois je suis obligé d'utiliser la fonction à chaque boucle, autant dire que le programme s'alourdit à chaque boucle.

    Enfaite le programme comptabilise des points, donc à chaque boucle, les valeurs changent ... et les textes affiché à l'écran doivent donc aussi changer. Alors les textes sont changés dans la boucle (si si c'est mathématique :) ).

    Je voudrais que l'effet du code ci dessous soit le même mais sans incrémenter la mémoire utilisé par le CPU à chaque boucle. Un genre de recette magique (ou manipulation) qui puisse exhausée mes voeux :p .


    // ...

    /* Ligne du message 1 */
    sprintf(messageScore, "Cible touchées : %d / %d !", rocketsTouches, rocketsLances - 1);
    textTemporaire = TTF_RenderText_Blended(police, messageScore, couleurBlanche);
    positionScore.x = LARGEUR_FENETRE - textTemporaire->w - MARGE_PAR_DEFAUT;
    positionScore.y = HAUTEUR_FENETRE - textTemporaire->h - MARGE_PAR_DEFAUT;
    SDL_BlitSurface(textTemporaire, NULL, ecran, &positionScore);

    /* Ligne du message 2 */
    sprintf(messageScore, "Munitions : %d %d %d", missile[0].tire, missile[1].tire, missile[2].tire);
    textTemporaire = TTF_RenderText_Blended(police, messageScore, couleurBlanche);
    positionScore.x = LARGEUR_FENETRE - textTemporaire->w - MARGE_PAR_DEFAUT;
    positionScore.y = HAUTEUR_FENETRE - textTemporaire->h * 2 - MARGE_PAR_DEFAUT;
    SDL_BlitSurface(textTemporaire, NULL, ecran, &positionScore);

    // ...


    Merci pour les éventuelles réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      28 mai 2006 à 19:56:45

      Salut :) ,
      le truc évident c'est que ton score ne change pas A CHAQUE BOUCLE donc il faut que tu change le texte dans ta surface uniquement si il y une modification du score.Tu fait une petite fonction pour ça et tu l'appelle quand tu change le score et uniquement à ce moment là. ;)


      • Partager sur Facebook
      • Partager sur Twitter
        28 mai 2006 à 19:58:30

        Il suffit de rajouter après le "blittage" de l'image SDL_FreeSurface(textTemporaire).
        • Partager sur Facebook
        • Partager sur Twitter
          28 mai 2006 à 20:17:56

          Tu peut combiner les deux méthodes : tu ne crée une nouvelles surface que si la valeur du score a changer (amélioration de la complexité temporelle), et tu libère l'espace avant de créer une nouvelle surface (amélioration de la complexité spatiale). Au final, ça fera un code qui devrait pas te prendre trop de temps à s'éxécuter...

          Voila un exemple qui peut marcher :

          SDL_Surface *afficher_score(int score)
          {
            static SDL_Surface* image_score = NULL;
            static score_precedent = -2;

            if(score != score_precedent) {
              SDL_FreeSurface(image_score);
              image_score = SDL_je-sais-plus-quoi-qui-crée-ton-image-du-score(score, ...);
            }
            return image_score;
          }
          • Partager sur Facebook
          • Partager sur Twitter
            28 mai 2006 à 20:37:05

            Citation : Sanco95



            // ...

            /* Ligne du message 1 */
            sprintf(messageScore, "Cible touchées : %d / %d !", rocketsTouches, rocketsLances - 1);
            textTemporaire = TTF_RenderText_Blended(police, messageScore, couleurBlanche);
            positionScore.x = LARGEUR_FENETRE - textTemporaire->w - MARGE_PAR_DEFAUT;
            positionScore.y = HAUTEUR_FENETRE - textTemporaire->h - MARGE_PAR_DEFAUT;
            SDL_BlitSurface(textTemporaire, NULL, ecran, &positionScore);

            /* Ligne du message 2 */
            sprintf(messageScore, "Munitions : %d %d %d", missile[0].tire, missile[1].tire, missile[2].tire);
            textTemporaire = TTF_RenderText_Blended(police, messageScore, couleurBlanche);
            positionScore.x = LARGEUR_FENETRE - textTemporaire->w - MARGE_PAR_DEFAUT;
            positionScore.y = HAUTEUR_FENETRE - textTemporaire->h * 2 - MARGE_PAR_DEFAUT;
            SDL_BlitSurface(textTemporaire, NULL, ecran, &positionScore);
            // ...



            Tu ne libères pas les surfaces crées pas TTF_RenderText_Blender(), voila pourquoi tu utilises tant de mémoire !
            Utilise SDL_FreeSurface() à chaque fois !!!
            • Partager sur Facebook
            • Partager sur Twitter
              28 mai 2006 à 21:33:47

              C'est bon j'ai (a moitié) résolu.
              Enfaite vous m'avez casi tous dit de mettre un FreeSurface, mais ca sert à rien puisque avec un freesurface, lorsqu'on recontre le SDL_Flip(ecran); la surface des scores est plus blitté.

              J'ai juste fait en sorte que le texte soit changé lorsqu'il le faut. Malheuresement ca prend encore un peu de mémoire CPU

              Sinon je laisse le sujet ouvert si quelqu'un aurait une solution pour que ca ne consomme plus aucune mémoire CPU :)
              • Partager sur Facebook
              • Partager sur Twitter
                28 mai 2006 à 21:49:25

                Non, tu actualises l'écran puis tu libères les surfaces de texte.
                • Partager sur Facebook
                • Partager sur Twitter
                  29 mai 2006 à 9:58:16

                  as tu regarde comme il le faut le code de nico... parce que tu free la surface que si elle doit changer donc ils y a une autre surface de recree immediatement apres que tu est fais ton free, resultat tu as toujours une surface a blite.

                  et pour se que tu disait au debut dans lef fait de ne pas mettre d'instruction lourde dans ta boucle c'est vrai et fau en meme temp, ce que tu doit faire c'est de ne pas mettre dans ta boucle se qui na qu'a etre execute une fois, et c'est valide pour n'importe quoi. ensuite comme dans le cas du score lorsque tu a quelque chose qui doit pouvoir changer au file de ton bouclage tu n'a effectivement pas le choix, alors tu y va comme on il ta ete presente en limitant au maximum le nombre de fois que l'action sera faite
                  • Partager sur Facebook
                  • Partager sur Twitter
                    29 mai 2006 à 10:09:34

                    Citation : Sanco95

                    Sinon je laisse le sujet ouvert si quelqu'un aurait une solution pour que ca ne consomme plus aucune mémoire CPU :)



                    moi moi moi j'ai la solution :)
                    tu vires tout et tu laisses juste le return 0; dans le main :lol::lol:

                    Sérieusement ton truc serait un problème si tu blittais toutes les 5 mili secondes mais enfin ton score n'est pas aussi variable je suppose. Ce qui bouffe vraiment 100% de ton cpu c'est une boucle à la SDL_PollEvent ou ce genre de chose pas un petit blit de temps en temps
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 mai 2006 à 10:39:36

                      Mémoire CPU, ça ne veut rien dire.

                      Quel est ton problème ? Si :
                      - Ton CPU est toujours à 100% -> un SDL_WaitEvent ou un SDL_Delay pourront t'aider à le soulager, à voir si ça vaut le coup dans ton programme
                      - Ta mémoire (RAM) augmente sans arrêt -> tu as des surfaces qui sont créées à chaque boucle, et qui ne sont pas supprimées, vérifie bien que tu les libères comme il faut (avec TTF_RenderText, il FAUT libérer la surface après le blit).
                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 mai 2006 à 14:16:32

                        C'est bon il y avait juste à liberer les surfaces aux deux créations (moi je libèrais qu'à une) et ca marche bien :) c'est bien ce que vous m'aviez dit de faire, merci (j'avais pas compris ^^).

                        Désolé de vous avoir impportunés mais je fais jamais deux fois les mêmes erreurs. :p
                        • Partager sur Facebook
                        • Partager sur Twitter

                        [C/SDL] Bien utiliser la mémoire.

                        × 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