Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Problème de deboggage d'un jeu  (Lu 2525 fois)

0 Membres et 1 Invité sur ce sujet

HugeThor

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Problème de deboggage d'un jeu
« le: Mai 04, 2017, 06:04:54 pm »
Bonsoir, je finalise un moteur graphique en SFML pour des jeux en 2D
j'ai fait des tests avec des textures, des sprites des sons...pas de problème

Mais au bout d'un certain temps, les FPS commencent à diminuer par moment...et les sons ne se jouent plus du tout
Voici l'erreur que mon debuggeur renvoie en boucle toutes les 2 secondes :




An internal OpenAL call failed in SoundSource.cpp(37).
Expression:
   alGenSources(1, &m_source)
Error description:
   AL_OUT_OF_MEMORY
   There is not enough memory left to execute the command.


si quelqu'un sait à quoi correspond ce type d'erreur qui vient visiblement de la mémoire, un conseil ou une solution (encore mieux) serait le bienvenu !

Merci beaucoup

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re: Problème de deboggage d'un jeu
« Réponse #1 le: Mai 04, 2017, 11:43:20 pm »
Salut, La solution ? détruire les objets alloué correctement.

HugeThor

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re: Problème de deboggage d'un jeu
« Réponse #2 le: Mai 05, 2017, 10:24:40 am »
Il me semble bien détruire les emplacements mémoires alloués une fois inutilisés...


voici une branche de code qui construit un pointeur pour tirer un projectile :

for (int i = 0; i < canonvec.size(); i = i + 1)
      {
         if (canonvec->isfiring() == true)
         {
            Bullet* ptr;
            ptr = new Bullet("images/bullet.png", { canonvec->getposx(),canonvec->getposy() }, 60, 38);
            canonbulletvec.push_back(ptr);
            ptr->playcanonbulletmusic();
            canonvec->setisfiring(false);

         }

         if (canontime.asSeconds() < shootingtiming2)
         {

         }
         else
         {
            canonvec->setisfiring(true);
            canonclock.restart();
         }

      }

Voici la sequence de code qui detruit le pointeur en question des que le projectile "bullet" depasse les bords de l'écran : 

for (int i = 0; i < canonbulletvec.size(); i = i + 1) // condition de destruction
      {
         canonbulletvec->setdegat(200);
         canonbulletvec->collision(mario);
         canonbulletvec->drawto(gamewindow);
         canonbulletvec->shoot(-10,0);
         



         if (canonbulletvec->getposx() < -80) // destruction des canonbullets
         {
            canonbulletvec = nullptr;
            delete canonbulletvec;
            canonbulletvec.erase(canonbulletvec.begin() + i);




         }

      

      }

si tu peux m'éclairer ce serait génial, je suis novice à la fois en C++ et en SFML (je code depuis 2 mois avec ce langage)
Merci!

HugeThor

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re: Problème de deboggage d'un jeu
« Réponse #3 le: Mai 05, 2017, 04:27:17 pm »
je mets fin à mon post, problème résolu avec l'utilisation des smart pointers plutot que des pointeurs classiques

Merci quand meme!

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re: Problème de deboggage d'un jeu
« Réponse #4 le: Mai 05, 2017, 06:39:10 pm »
si cela marche avec des "smart" pointeurs , c'est bien que ta destruction est foireuse quelque part. Rien que ta boucle de destruction ne n'inspire pas, je ne vois pas ou tu itères.

Si tu débute le c++, oublie le smart pointeur, fait du code plus simple. regarde aussi comment supprimer un élément avec un prédicateur au lieu de faire une boucle de bourrin dans le vide.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re: Problème de deboggage d'un jeu
« Réponse #5 le: Mai 05, 2017, 10:43:51 pm »
Citer
oublie le smart pointeur, fait du code plus simple
Les classes que l'on qualifie de "pointeurs intelligents" sont justement là pour aider à faire du code plus simple. L'équivalent en pointeur brut va, selon le cas, de "plus compliqué" à "carrément foireux si on n'est pas expert".

Citer
regarde aussi comment supprimer un élément avec un prédicateur
Plutôt un prédicat ;D
Laurent Gomila - SFML developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re: Problème de deboggage d'un jeu
« Réponse #6 le: Mai 06, 2017, 10:09:07 am »
Oui, autant pour moi, un prédicat...
Pour ma part, je trouve plus simple d'utilisé des pointeurs bruts , et bien comprendre le mécanisme de ce que l'on fait , utilisé des smarts pointeur sans savoir ce qu'il se passe sous le capot n'est pas de mon point de vue formateur , même si par la suite il est préférable de les utilisés