Partage
  • Partager sur Facebook
  • Partager sur Twitter

simple affichage

proc à 60% et +

    28 février 2008 à 22:02:17

    bonjour
    codant en sfml , je fais l'affichage d'image à l'écran dans une fenetre bien sûr ^^
    mais le truc c'est que cette fenetre prend jusqu'à 60% des capacité processeur avec uniquement 10 mo de mémoire vive utilisé
    voici le code , quelqu'un pourrait m'aider pour faire baisser ce "gouffre" à ressource ???

    1. #include <SFML/Graphics.hpp>
    2. int main()
    3. {
    4.     RenderWindow ecran;
    5.     ecran.Create(VideoMode(800, 600, 32), "fenetre");
    6. /* essayer mais change rien
    7.  ecran.SetFramerateLimit(35);
    8. */
    9.     Jeu(&ecran);
    10.     return EXIT_SUCCESS;
    11. }


    et la fonction jeu est :

    1. void Jeu(RenderWindow *ecran)
    2. {
    3.     Tile tile;
    4.     tile.chargerSprite(&config);
    5.     bool continuer=true;
    6.     while(continuer)
    7.     {
    8.         Event Event;
    9.         while(ecran->GetEvent(Event))
    10.         {
    11.             if (Event.Type == Event::Closed)
    12.                 continuer = false;
    13.             if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
    14.                 continuer = false;
    15.         }
    16.         tile.chargerMap(&config);
    17.         tile.Afficher(ecran);
    18.         ecran->Display();
    19.     }
    20. }


    merci beaucoup
    PS: la class Tile ne fais pas grand chose , donc je ne m'amuse pas à tout mettre !!!

    merci encore pour vos futurs réponses
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 février 2008 à 22:30:05

      Peut être, mais à cause de ca, on na pas d'exemple minimal, complet et compilable.
      • Partager sur Facebook
      • Partager sur Twitter
        29 février 2008 à 6:03:39

        voici le code simplifier de la suite als !!!!
        1. Tile::Tile()
        2. {}
        3. Tile::~Tile()
        4. {}
        5. int Tile::S2I(const std::string& s)
        6. {
        7.     int obj = 0;
        8.     istringstream is(s);
        9.     is >> obj;
        10.     return obj;
        11. }
        12. void Tile::chargerMap(Configuration *config)
        13. {
        14.     int i, j;
        15.     string m_nom,terrain, sousCouche;
        16.     string chemin = "Data/Maps/maps-maps1,1.bsp";
        17.     ifstream fichier;
        18.     fichier.open(chemin.c_str(), ios::in);
        19.     if(fichier)
        20.     {
        21.         for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
        22.         {
        23.             for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
        24.             {
        25.                 char caractere;
        26.                 do
        27.                 {
        28.                     fichier.get(caractere);
        29.                     if(caractere=='*')
        30.                     {
        31.                         fichier>>terrain;
        32.                         fichier>>sousCouche;
        33.                     }
        34.                 }
        35.                 while(caractere!='$');
        36.                 tableau[j][i].terrain=S2I(terrain);
        37.                 tableau[j][i].sousC=S2I(sousCouche);
        38.             }
        39.         }
        40.     }
        41.     else
        42.     {
        43.         cout << "Impossible d'ouvrir le fichier : " << chemin <<endl;
        44.     }
        45.     fichier.close();
        46. }
        47. void Tile::Afficher(RenderWindow* ecran)
        48. {
        49.     int i=0;
        50.     for (i = 0 ; i < NB_BLOCS_HAUTEUR ; i++)
        51.     {
        52.         for (j = 0 ; j < NB_BLOCS_LARGEUR ; j++)
        53.         {
        54.             int X= j*TAILLE_BLOC;
        55.             int Y= i*TAILLE_BLOC;
        56.             Sprite=tile[tableau[j][i].terrain];
        57.             Sprite.SetPosition(X, Y);
        58.             ecran->Draw(Sprite);
        59.         }
        60.     }
        61. }
        62. void Tile::chargerSprite(Configuration *config)
        63. {
        64.     std::string chemin= "Data/image/image-sprit.png";
        65.     int z=0;
        66.     image.LoadFromFile(chemin.c_str());
        67.     for (z = 0 ; z < 6 ; z++)
        68.     {
        69.         tile[z]=(image);
        70.     }
        71.     tile[0].SetSubRect(IntRect(0, 0, 0, 0));
        72.     tile[1].SetSubRect(IntRect(0, 0, 32, 32));
        73.     tile[2].SetSubRect(IntRect(32, 0, 64, 32));
        74.     tile[3].SetSubRect(IntRect(64, 0, 96, 32));
        75.     tile[4].SetSubRect(IntRect(96, 0, 128, 32));
        76.     tile[5].SetSubRect(IntRect(128, 0, 160, 32));
        77.     tile[6].SetSubRect(IntRect(160, 0, 192, 32));
        78. }
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          29 février 2008 à 6:55:50

          Y a pas a chercher ta boucle est infinit sans delay mets un Sleep(10) et ca iras mieu.
          • Partager sur Facebook
          • Partager sur Twitter
            29 février 2008 à 12:45:13

            euh je le mets d'où se Sleep(10) ???
            elle sert à quoi cette fonction ???
            merci beaucoup
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              29 février 2008 à 13:54:32

              *Tu la met dans la boucle de void Jeu
              *pour son rôle, RTFM non ?
              • Partager sur Facebook
              • Partager sur Twitter
                29 février 2008 à 15:40:50

                Une boucle principale sans Sleep!

                Le Sleep c'est pour être GENTIL avec ton processeur, pendant ces quelques millisecondes tu remets la main au processeur pour qu'il puisse effectuer d'autres tâches!

                On a beau trouver que notre application c'est la plus importante mais il ne faut pas s'enfler la tête ;). ne soyez pas gourmant et égoïstes, faites un Sleep.

                Je vote pour un Sleep( 100 ) ou un Sleep( temps_utilise_par_tour_de_boucle / besoin_de_vitesse * MULTIPLICATEUR_DATTENTE ) mais bon c'est un peu intense ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  29 février 2008 à 16:28:43

                  ou bien, avant d'entrer dans la boucle principal, tu peux mettre :

                  1. ecran->UseVerticalSync(true);


                  Ce qui vas activer la synchronisation vertical, ce qui est assez sympa. ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                    29 février 2008 à 18:46:28

                    d'autre conseil ???
                    et je peux paraître lourd , mais à quelle ligne dans le void Jeu mettre la fonction Sleep ??
                    pareil pour useverticalsync dans la boucle principale ??
                    merci quand même !!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 février 2008 à 19:55:27

                      Citation : bougaloo

                      pareil pour useverticalsync dans la boucle principale ??


                      Citation : shadosan

                      avant d'entrer dans la boucle principal,

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Altarapp.com - Applications, Code Snippets, API Wrappers et etc, le tout en C# le plus clair du temps!
                        29 février 2008 à 21:50:12

                        le Sleep est souvent mit comme dernière instruction dans un bloc de boucle.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          2 mars 2008 à 11:40:19

                          re bonjour ,
                          je viens de tester ce que vous m'avez donné comme aide et ....
                          le UseVerticalSync diminue la charge processeur uniquement de 4% :(
                          ensuite pour le Sleep(10); , çà ne veut plus compiler ; pk ?
                          voici le ocde
                          1. void Jeu(RenderWindow *ecran)
                          2. {
                          3.     Tile tile;
                          4.     tile.chargerSprite(&config);
                          5.     bool continuer=true;
                          6.     while(continuer)
                          7.     {
                          8.         Event Event;
                          9.         while(ecran->GetEvent(Event))
                          10.         {
                          11.             if (Event.Type == Event::Closed)
                          12.                 continuer = false;
                          13.             if ((Event.Type == sf::Event::KeyPressed) && (Event.Key.Code == sf::Key::Escape))
                          14.                 continuer = false;
                          15.         }
                          16.         tile.chargerMap(&config);
                          17.         tile.Afficher(ecran);
                          18.         ecran->Display();
                          19.         Sleep(10);
                          20.     }
                          21. }
                          • Partager sur Facebook
                          • Partager sur Twitter
                            2 mars 2008 à 22:03:48

                            sa yé je viens enfin de faire fonctionner la fonction sleep !!!
                            mais le truc c'est que maintenant çà fait clignoter mon affichage de map et perso :S
                            c'est normal ??? j'ai pourtant bien mis 10 , et le pire c'est que le programme alterne entre normal et (programme ne réponds plus ) !!!
                            une solution ??? sinon il faut que je reste toujours en 60% de charge proco occupé !!!
                            • Partager sur Facebook
                            • Partager sur Twitter
                              3 mars 2008 à 0:37:07

                              tout au debut de ton programme, mets un :
                              ecran->SetFramerateLimit(30)
                              • Partager sur Facebook
                              • Partager sur Twitter

                              simple affichage

                              × 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