IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

[Non-Resolu!]Aplication SDL qui rame et fini par plenter.


Sujet :

SDL

  1. #1
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut [Non-Resolu!]Aplication SDL qui rame et fini par plenter.
    Bonjour, sela fait plusieures jours que je tente de trouver la source d'un problème dans mon application.
    Il emblerais que au fure et a mesure que mon aplication tourne elle prène de plus en plus de mémoire, puis apprès que le fichier d'échange windows est été étendu, elle finis par plenter.
    J'en ai donbc dédui que sela venais de la construction d'objet en chaine dans une boucle, enfaite pour mieux comprendre mon programme, il faut avoir qu'une classe gère les maps, et la fonction MonInstanceMap->BlitSurface(ecran); est apeller en boucle dan draw();
    J'ai beau chercher, je me rend compte que le ralentissement apparait que l'orsque la surface de la map a une taille conséquente, pourtant avent que je change quelques petites choses dedan, elle fonctioner parfaitement avec une vitesse de 60FPS. J'ai eu beau passer en commentaire toute mes modification, le problème se prouit et je n'arive pas a toruver la source.
    Je me reporte donc a vos conaissences pour m'aider a localiser ce problème.

    Voici la partie que je juge importante du code :


    Main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    int main (int argc, char *argv[])
    {
        //...
     
        //Simulation de load d'une map :
            Carte = new Sprit_Map::basic_map( "data/tst.map" );
            Carte->unserialize( "data/tst_2.map" );
            Carte->MakeSurface();
        //fin de simulation
        W_SDL_done = 0;
        while (!W_SDL_done)
        {
            SDL_Event event;
     
            //Renvoi au fonctions de gestion
            while (SDL_PollEvent (&event))
            {
                switch (event.type)
                {
                case SDL_KEYDOWN:
                case SDL_KEYUP:
                    keyboard();
                    break;
                case SDL_QUIT:
                    W_SDL_done = 1;
                    break;
                case SDL_MOUSEMOTION:
                case SDL_MOUSEBUTTONDOWN:
                case SDL_MOUSEBUTTONUP:
                     mouse();
                     break;
                default:
                    break;
                }
            }
     
            //Dessin de l'écran
            draw ();
        }
        //...
    }
     
     
    void draw ()
    {
        bug_log((std::string)"    draw(); FPS = " + t_std::to_dec(FPS::base_FPS::GetInstance().CalcFPS()) + (std::string)"\n");//De-Bug
        //Netoyage de l'écran :
        SDL_FillRect(screen, NULL, SDL_BGColor);
     
        //Teste de la map :
        std::cerr << "Carte->BlitSurface(screen); ::::: " << Carte->BlitSurface(screen) << "\n";
     
     
        //FPS
        FPS::base_FPS::GetInstance().ShowFPS( screen, Width_S, Height_S );
     
        //Echange des buffers
        SDL_Flip (screen);
     
        //Pause de 0MiliSeconde
        SDL_Delay (0);
    }


    Map.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    Sprit_Map::basic_map::basic_map( std::string _file )
    {
        serialize(_file);
    }
    Sprit_Map::basic_map::~basic_map( )
    {
        SDL_FreeSurface(Screen);
    }
    bool Sprit_Map::basic_map::serialize( std::string _file )
    {
        //Open
        std::ifstream Map_Load( _file.c_str() );
        if(!Map_Load || Map_Load == NULL){return false;}
        //Name
        std::getline( Map_Load, name, '|');
        //Width
        std::string width_s;
        std::getline( Map_Load, width_s, '|' );
        t_std::from_string( width_s, width );
        //Height
        std::string height_s;
        std::getline( Map_Load, height_s, '|' );
        t_std::from_string( height_s, height );
        //Alpha
        std::string alpha_s;
        std::getline( Map_Load, alpha_s, '|' );
        t_std::from_string( alpha_s, alpha );
        /*
        Code que j'ai passer en commentaire car il s'ocupe de créer d'autres objet imbriquer les un dans les autres qui contiènent la map sous forme de block ect.. Mais que je ne fait pas fonctioner l'hor des testes!
        */
        return true;
    }
    bool Sprit_Map::basic_map::unserialize( std::string _file )
    {
        //Open
        std::ofstream Map_UnLoad( _file.c_str() );
        if(!Map_UnLoad || Map_UnLoad == NULL){return false;}
        //Name
        Map_UnLoad << name << '|';
        //Width
        Map_UnLoad << width << '|';
        //Height
        Map_UnLoad << height << '|';
        //Alpha
        Map_UnLoad << alpha << '|';
     
        /*
        Code que j'ai passer en commentaire car il s'ocupe de créer d'autres objet imbriquer les un dans les autres qui contiènent la map sous forme de block ect.. Mais que je ne fait pas fonctioner l'hor des testes!
        */
     
        return true;
     
    }
    bool Sprit_Map::basic_map::BlitSurface(SDL_Surface *screen_r)
    {
        if(screen_r == NULL){return false;}
        if(Screen == NULL)
          if(!MakeSurface()){return false;}
        SDL_BlitSurface(Screen, NULL, screen_r, NULL);
        return true;
    }
    bool Sprit_Map::basic_map::MakeSurface()
    { 
        if(Screen == NULL)
          Screen = SDL_AllocSurface( SDL_SRCALPHA , width*32, height*32, 32, r_mask, g_mask, b_mask, a_mask);
        if(Screen == NULL){return false;}
        Uint32 RGB_BACK = SDL_MapRGB(Screen->format, 255, 255, 255);
        SDL_FillRect(Screen, NULL, RGB_BACK);
        /*
        Code que j'ai passer en commentaire car il s'ocupe de créer d'autres objet imbriquer les un dans les autres qui contiènent la map sous forme de block ect.. Mais que je ne fait pas fonctioner l'hor des testes!
        */
        SDL_SetAlpha(Screen, SDL_SRCALPHA, alpha);
        return true;
    }


    Un FPS afficher a 12/17/16... Alors que dans un cas normale le FPS afiche des chifres avoisinan 60, et surtout les chifres change extrèmement rapidement(parfois on ne voi que la disaine mais on n'arive pas a distinguer l'unitée) aulieu de cette actuèle "freez".
    Les résultats du débug sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    ##############################
    #           START            #
    #      Project Fantasy       #
    #            0.1             #
    ##############################
      mouse();
      mouse();
        draw(); FPS = 1
        draw(); FPS = 100
        draw(); FPS = 166
      mouse();
        draw(); FPS = 142
        draw(); FPS = 166
        draw(); FPS = 166
        draw(); FPS = 166
        draw(); FPS = 111
        draw(); FPS = 166
        draw(); FPS = 166
        draw(); FPS = 200
        draw(); FPS = 166
        draw(); FPS = 166
        draw(); FPS = 200
        draw(); FPS = 250
        draw(); FPS = 200
        draw(); FPS = 200
        draw(); FPS = 200
        draw(); FPS = 200
        draw(); FPS = 200
        draw(); FPS = 166
        draw(); FPS = 200
        draw(); FPS = 166
        draw(); FPS = 166
        draw(); FPS = 200
        draw(); FPS = 142
        draw(); FPS = 166
        draw(); FPS = 166
        draw(); FPS = 200
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 200
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 111
      mouse();
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 166
        draw(); FPS = 166
      keyboard();
      keyboard();
        draw(); FPS = 21
        draw(); FPS = 166
        draw(); FPS = 142
        draw(); FPS = 142
      mouse();
      mouse();
      mouse();
        draw(); FPS = 100
        draw(); FPS = 17
      mouse();
        draw(); FPS = 111
      keyboard();
      keyboard();
        draw(); FPS = 90
        draw(); FPS = 142
        draw(); FPS = 166
      keyboard();
      keyboard();
        draw(); FPS = 142
      mouse();
      mouse();
      mouse();
      mouse();
        draw(); FPS = 76
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 200
      mouse();
        draw(); FPS = 166
      mouse();
        draw(); FPS = 166
      mouse();
      keyboard();
      keyboard();
      keyboard();
      keyboard();
        draw(); FPS = 200
      keyboard();
      keyboard();
      mouse();
        draw(); FPS = 142
      mouse();
      mouse();
        draw(); FPS = 166
      mouse();
      mouse();
        draw(); FPS = 166
        draw(); FPS = 166
      keyboard();
      keyboard();
      keyboard();
        draw(); FPS = 166
    ##############################
    #             END            #
    ##############################

  2. #2
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Salut,
    alors rapidement ce que je vois dans le while()
    draw(); , dans le draw();, je vois Carte->BlitSurface(screen)

    dans Sprit_Map::basic_map::BlitSurface,
    il a MakeSurface()
    et dans Makesurface il y a SDL_AllocSurface

    J'ai donc l'impression que tu alloues en boucles une surface SDL.

    J'imagine que Screen est une variable de classe de basic_map ?
    il faudrait peut être ajouté quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    bool Sprit_Map::basic_map::MakeSurface()
    {
        if ( Screen ) return true;  // A ajouter pour éviter les multiples alloc
        Screen = SDL_AllocSurface( SDL_SRCALPHA , ...);
        if( !Screen ){return false;}
         ...
    }
    [/code]

  3. #3
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Screen est une variable SDL_Surface.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool Sprit_Map::basic_map::BlitSurface(SDL_Surface *screen_r)
    {
        if(screen_r == NULL){return false;}
        if(!MakeSurface()){return false;}
        SDL_BlitSurface(Screen, NULL, screen_r, NULL);
        return true;
    }
    Hum, je croi que j'ai oublier un if(Screen == NULL).
    Je teste sa ^^

  4. #4
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Remarque que ce que j'ai mis est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ( Screen != NULL ) return true;
    Le premier appel à la fonction devrait continuer,
    puis le second faire return true car le SDL_Alloc à allouer Screen
    qui ne vaut donc plus 0.
    sous réserve que ton constructeur place à 0 la variable Screen.

  5. #5
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    J'ai fait sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        if(screen_r == NULL){return false;}
        if(Screen == NULL)
          if(!MakeSurface()){return false;}
        SDL_BlitSurface(Screen, NULL, screen_r, NULL);
        return true;
    Car si pour une réson quelquonque la surface n'est pas créer, mais que entre temp des choses se sont passer on retante de la créer.

    Mais bon sa reste a 12FPS et sa continu de rammer >_<


    Bon alors en fait a chaque fois la surface est re-créer...
    Pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if(Screen == NULL)
          if(!MakeSurface()){return false;}
    devrais n'avoir lieu qu'une fois puisque ...

  6. #6
    mat.M
    Invité(e)
    Par défaut
    Je veux pas troller mais SDL ça rame ;
    j'ai essayé de porter le projet que je développe avec DX sous SDL , j'ai laissé tombé au bout de quelques heures.
    Et impossible d'optimiser l'affichage j'ai pas trouvé.

    Envoie-moi ton projet je vais te le convertir sous DDraw / Direct X natif.
    Tant pis pour la portabilité sous Linux mais SDL ça rame.

    Ou alors prends une autre bibliothèque.
    Irrlicht 3D ça tourne du tonnerre et en plus on fait de la 3D , pas avec SDL.

  7. #7
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Tu vois dans tes traces que la surface est recrée ?
    Là, je ne vois pas trop pourquoi en effet.

    Je ne suis pas sûr que ce soit une bonne idée de mettre
    le SDL Alloc à l'intérieur de la boucle droit et/ou du BlitBit.
    Tu devrais plutôt le déplacer à l'extérieur dans le constructeur de ta classe par exemple.

    Je veux pas troller mais SDL ça rame ;
    Bon début en tout cas...

  8. #8
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    En faite voici la logique :
    J'ouvre avec mon objet mon fichier de map(serialize)
    Je créer la surface MakeSurface();(facultatife)
    BOUCLE{Je blit[Si ya pas de surface->MakeSurface();];}

    Donc, technoiquement, la surface n'est senser être créer qu'une fois, parfois plus si pour une réson quelquonque a un moment donner suite a une action de l'utiliateur je doit refabriquer la surface(dans ce cas je peut apeller la fonction de re-fabrication).

    Donc il faudras que je torve pourquoi if(Screen == NULL) est toujours vrai?! Normalement il ne devrais être vrai qu'une fois!!!


    Sinon j'ai noter qu'il faut aussi mêtre un if(Screen == NULL) autour du SDL_Alloc


    Sinon mon très chère mat.M, j'arive a avoir un fps de 60 avec un blit de 100% de l'écran depuis ma surface de map, et le tout avec un ordinateur qui galère pour aficher fable avec les réglages minimumes(FPS+TailleEcran+Pas d'ombre, pas de smouth....)
    Donc sur on ordi moyen je suis sertin que mon jaux auras une vitesse bien sufisante, surtout que je pensse re-pensser la blit pour ne pas recouvrir tout l'écran et ainsi peutètre avoir un fps dans les 80...

    Zenol, qui présise que toutes les solutions sont bonnes et approprier dans certains cas donner...




    Edit :
    P'tit debug histoire de savoir ou sa cloche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    bool Sprit_Map::basic_map::BlitSurface(SDL_Surface *screen_r)
    {
        if(screen_r == NULL){return false;}
        if(Screen == NULL)
          {std::cerr << "Screen == NULL\n";if(!MakeSurface()){return false;}}
        SDL_BlitSurface(Screen, NULL, screen_r, NULL);std::cerr << "Blit!\n";
        return true;
    }
    bool Sprit_Map::basic_map::MakeSurface()
    {
        if(Screen == NULL)
          {Screen = SDL_AllocSurface( SDL_SRCALPHA , width*32, height*32, 32, r_mask, g_mask, b_mask, a_mask);std::cerr << "Alloc\n";}
        if(Screen == NULL){return false;}
        Uint32 RGB_BACK = SDL_MapRGB(Screen->format, 255, 255, 255);
        SDL_FillRect(Screen, NULL, RGB_BACK);/*
        list_block::iterator i = block_l.begin();
        while (i != block_l.end())
        {
          (i->second).BlitSurface(Screen, width*32, height*32);
          ++i;
        }*/
        SDL_SetAlpha(Screen, SDL_SRCALPHA, alpha);
        return true;
    }
    Et p'tit résultat :
    (Le Carte->BlitSurface(screen); ::::: <BOOL> c'est le résultat du blit dans le main(){})
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Alloc
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Blit!
    Carte->BlitSurface(screen); ::::: 1
    Vous trouvez sa normale vous??? Pas moi, "Screen == NULL\n" n'est pas aficher, pourtant on a bien un apelle a MakeSurface et un std::cerr << "Blit!\n"; .... De plus en plus bizare >_<

  9. #9
    mat.M
    Invité(e)
    Par défaut
    Pourquoi tu réalloues des objets dans la fonction de "Blit" ???
    normal que ça rame !
    Tu refais des allocations mémoires celle ci se fragmente !
    Essaies d'optimiser et faire plus simple.
    Plus tu fais simple plus ce sera performant.


    Qu'est ce que tu veux faire ????
    Peux-tu détailler ?
    Comment est structuré un fichier map ????
    Si c'est pour afficher des "tuiles" d'écran c'est à dire un fond représentant de l'herbe, de l'eau , il suffit de remplir un tableau de cases de 64*64 , 32*32 et de se déplacer dans ce tableau.
    Pour afficher , 2 boucles imbriquées en X et Y balaieront le tableau pour afficher les cases.

    Si tu veux faire un défilement, il suffit alors de calculer un offset

    Par exemple la structure représentant un élément de décor c'est tout bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct tuile{
    int x;
    int y;
    int reference_bitmap;
    bool bTraversable;
    }
     
    tuile tab_tuiles[MAX_TUILES_X*MAX_TUILES_Y];
    Après reference_bitmap pointe sur un indice représentant un tableau de surfaces SDL...

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Un très bon concept pour s'inspirer
    "Keep It Short and Simple"


    http://en.wikipedia.org/wiki/KISS_principle

    A méditer

    http://www.devmaster.net/wiki/Starting_a_project

    ( merci Loulou24 pour le lien )

  11. #11
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Je doit alouer la surface 1 seul fois, (grace a if(Screen != NULL) qui a l'aire de fonctioner)
    Ensuite j'ai besin d'une classe pour jouer sur la position, le fait que les donées viène de plusieures fichier, gèrer la trensparence ect.
    Je vais esseilelr de faire d'autre teste car le if(Screen != NULL) a bien lieux et la surface est bien allouer une fois mentenant.
    Par contre le jeux continu d'être long.
    Si vous voulez les sources complètes : http://t4cwebserver.free.fr/src_fp.zip
    (Nb : L'afichage n'a pas lieux, c'est normale, je n'ai pas modifier certaines choses dans le basic_map_block_sprit::blit mais sela n'a pas d'importance, l'important serais d'avoir un fps normale.)

  12. #12
    Membre averti
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Points : 307
    Points
    307
    Par défaut
    Salut,
    alors, la fuite de mémoire vient (du source que tu as posté)
    de la fonction bool TxT::BlitSurface(SDL_Surface *screen_r).
    Il manque un SDL_FreeSurface après le TTF_RenderText_xxxx (Shaded ou Solid) en cas de succès.
    (sprit.cpp)

    Quant au FPS, j'ai quand même 16/s.
    Je ne suis pas allé dans le détail mais en tout cas ça ne fuit plus.

  13. #13
    mat.M
    Invité(e)
    Par défaut
    Ok Jc_Master je vais regarder ça

  14. #14
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Merci Hylvenir, c'est déja sa de réparer
    J'ai remarquer qu'en enlevan le SDL_BlitSurface, on passe a plus de 100FPS, c'est vraiment étrange, bliter une surface de la taille de l'écran ne doit pas ralentir autent l'afichage...
    Et merci mat.M de regarder.

    Bon alors en modifien le positionement du log, j'arive a obtenir dans le fichier le PS qui se trouve a l'écran. Mais sa me dit toujours pas pourquoi blitter une surface de la taille de l'écran est si long, alors qu'évent s'était bocoup plus coure... (Et supprimez le blit de la map vous passerez au dessu de 100FPS)
    NB: Maj des sources

    /!\J'ai fait une importante constatation en cherchan bien. Je suis sertin que le problème vien de la surface, car en remplacen la partie de code qui blit par une surface de la m^me taille sa ne ram plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    bool Sprit_Map::basic_map::BlitSurface(SDL_Surface *screen_r)
    {
    SDL_Surface *Screen_Temp = SDL_AllocSurface( SDL_SRCALPHA , 24*32, 24*32, 32, r_mask, g_mask, b_mask, a_mask);
    SDL_BlitSurface(Screen_Temp, NULL, screen_r, &SelectPart);
    SDL_FreeSurface(Screen_Temp);
    return true;
    }
    C'est plutot etrenge, si je créer ma surface et que je la blit en une itération, sa vas plus vite que si je blit ma surface déja en mémoire qui est déja créer.... Quelquin pourais m'expliquer cela?

  15. #15
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Hello, je n'ai pas suivi tout le sujet mais concerant la lenteur du blit, il peut venir du fait que le format d'affichage n'est pas le même sur les 2 surfaces.

    Il faut alors par exemple initialiser l'image avec le même format que l'écran. Si tu as initialisé ta fenêtre en 32 bits et que tu blittes chaque fois des images 16 bits, la SDL doit tout le temps faire la conversion, il faut le faire une fois pour toute avec SDL_DisplayFormat.

    Ce n'est peut-être pas ça ton problème, mais je sais que ça peut fortement ralentir une application

  16. #16
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Non, j'ai initialiser ma surface de la même manière dans les deux cas. Même nombre de couleur, mêmes masques...

    De plus j'ai trouver un autre problème : plentage quand on veut arrèter le programme avec echap. Dans 50% des cas sa plente...

    Personne na la moindre piste pour trouver d'ou vien le problèmme? Y a t'il un moyen de comparer les surface? D'ou pourais provenir la diférence de vitesse?

  17. #17
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Je n'ai pas tout suivi, mais est-ce que le fait de charger / décharger la font à chaque affichage de FPS ne serait pas la cause de ces ralentissements ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Uint16 FPS::base_FPS::ShowFPS(SDL_Surface *screen, Uint32 Width_S, Uint32 Height_S, Uint32 R, Uint32 V, Uint32 B)
    {
        Uint16 FPS_Val = CalcFPS();
        ShowFPS_string->SetMessage( t_std::to_dec(FPS_Val) + " FPS" );
        ShowFPS_string->LoadFont("data/def.ttf", 32);
        ShowFPS_string->Position()->x = Width_S - 140;
        ShowFPS_string->Position()->y = Height_S - 32;
        ShowFPS_string->SetColor(screen->format, 0, 0, 0);
        ShowFPS_string->BlitSurface(screen);
        ShowFPS_string->CloseFont();
        TimeM = SDL_GetTicks();
    }
    D'ailleurs est-ce que tu es sûr de ton calcul de framerate ? Car à 5 FPS, j'ai un pointeur de souris drôlement fluide (à moins qu'il soit géré bizarrement par SDL).

  18. #18
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Pour mon calcule, comme on le voit dans le code, il représente le temp entre deux draw.

    Sinon j'arive facilement a plus de 100 FPS en passent en comentaire le contenu de la fonction Sprit_Map::basic_map::BlitSurface.

    Je présise que j'avais une vitesse de 40FPS avec le même systheme d'afichage de FPS, aven de modifier le namespace Sprit_Map(je ne me souvien plus tout a fait ce que j'ai changer mais j'ai surtout rajouter le chargement de la liste des fichier et les listes associatives)


    (J'en profite pour glisser une question dont la réponsse me seras utile seulement si je parvien a résoudre le problème : Coment organiser mes listes asosiative pour pouvoir accèder a un élément a partir de X et Y, un peut come un tableau 2D du genre tab[X][y] mais qui soit un type map ? )

Discussions similaires

  1. [NON RESOLU] Problème changement maitre détail - Requête SQL
    Par Leesox dans le forum Bases de données
    Réponses: 1
    Dernier message: 18/08/2005, 10h49
  2. VESA qui rame
    Par Smortex dans le forum Assembleur
    Réponses: 26
    Dernier message: 25/07/2004, 18h47
  3. Adsl qui rame sous mdk 9.1
    Par Kehel dans le forum Réseau
    Réponses: 5
    Dernier message: 29/09/2003, 23h29
  4. [NON RESOLU] Socket
    Par Max Payne dans le forum Développement
    Réponses: 2
    Dernier message: 05/06/2003, 16h38
  5. [NON RESOLU][PostgreSQL] Replication
    Par ive69 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 30/04/2003, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo