CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

ralentissement dans une boucle

Perdu_de_linfo
Perdu_de_linfo
Niveau 9
29 mars 2005 à 20:03:28

Salut à tous,

voila, j´ai décidé de reprendre mon pong et de l´améliorer.
Première chose: restructuration du code,modularité
Ceci me permettant ensuite de modifier mon jeu. ( l´ancienne manière étant beaucoup trop bordellique).
J´ai déja effectué qq changements, mais je suis bloqué au niveau de ma fonction qui joue un son.
Donc je vous montre déja la fonction:

void play_song(char* zik, int canal)
{
FSOUND_STREAM* g;
int r;
FSOUND_Init(44100, 32, 0);
FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
FSOUND_SetDriver(0);
g = FSOUND_Stream_Open(zik,0, 0,0);
r = FSOUND_GetError ( );
FSOUND_Stream_Play(canal,g);

}

que j´appel dans la boucle du jeu :

play_song("sons/touche.mp3",0);

Ca marche, mais, comme vous pouvez vous en douter, cette fonction demande pas mal de trucs, et oui, ca ralenti considérablement le jeu au moment de jouer le son.
J´ai donc essayé de créer deux fonctions :

void init_zik()
{
FSOUND_STREAM* g;
int r;
FSOUND_Init(44100, 32, 0);
FSOUND_SetOutput(FSOUND_OUTPUT_DSOUND);
FSOUND_SetDriver(0);
}

et :

void play_song(char* zik, int canal)
{
g = FSOUND_Stream_Open(zik,0, 0,0);
r = FSOUND_GetError ( );
FSOUND_Stream_Play(canal,g);
}

Et donc je n´appelais que la deuxieme fonction pour voir si le temps diminuait.
Mais la... je n´arrive a plus rien.
Je n´ai que des messages d´erreur concernant les deux fonctions ( g undeclared et autres).

Ensuite, je me suis posé la question, de quand libérer la place?
A quel place devrais-je mettre le " FMUSIC_FreeSong(f);"?
A la fin du prog ou après chaque fois que je joue le son?
J´ai pensé donc à la fin du prog ( autant dire jamais vu qu´on le ferme, non?).

Voila, c´est un peu confus, j´en suis désolé.
Si vous pouvez m´apporter des idées, ou même, des solutions, je vous en serais très reconnaissant :)

Vengeur41
Vengeur41
Niveau 10
29 mars 2005 à 20:05:33

Vu que tu la recharge à chaque fois, je te conseil de l´appeler a chaque fois que tu as joué le son.

Petite précision : si c´est pour des petits sons, utilise les samples.

Ruffi
Ruffi
Niveau 9
29 mars 2005 à 20:08:52

Apres un bref coup d´oeil : tu declare g et r dans la fonction init_zik et tu les utilise dans play_song

4 choix :
a) les mettent en globales
b) les ecapsuler dans une classe
c) les envoyer en paramttres
d) la reponse d :)

( A mon avis, le mieu est la reponse b, mais il faut que tu sache programmer orienté objet)

Perdu_de_linfo
Perdu_de_linfo
Niveau 9
29 mars 2005 à 20:09:51

zut, oublié de préciser qu´il s´agissait de la librairire fmod :)

Quintoff
Quintoff
Niveau 10
29 mars 2005 à 20:10:12

Ben tu devrais pas faire un thread a part :doute:

Perdu_de_linfo
Perdu_de_linfo
Niveau 9
29 mars 2005 à 20:14:49

Oui ce sont des petits sons en effet.

Vu que tu la recharge à chaque fois, je te conseil > de l´appeler a chaque fois que tu as joué le son.

Ca me prendra justement beaucoup de temps non?

Ruffi, je suis pas sur d´avoir compris, je vais quand même essayer.
Quintoff, j´ai pas compris?

Ruffi
Ruffi
Niveau 9
29 mars 2005 à 20:16:59

Apres avoir relu ton code :

Il faut que tu deplace
FSOUND_STREAM* g;
int r;
dans ta fonction play_song

Là, ca devrai marcher.

Lapintade
Lapintade
Niveau 30
29 mars 2005 à 20:18:57

Je pense que Vengeur41 a raison. Tu utilise les fonction " musique" pour jouer un simple son. C´est une chose trés lourde qui prends du temps ( ouvrir flot musique, charger musique, init des voies, lancement de la musique, ensuite fermeture des voies, fermeture du stream, liberation de la memoire) et c´est pas vraiment faire pour. Regarde si il existe pas des fonction pour jouer des samples tout simplement. Tu les charge une fois au debut et ensuite tu fais juste " play" a chaque fois que tu en a besoin.

Vengeur41
Vengeur41
Niveau 10
29 mars 2005 à 20:19:16

Ah bon, y´a des threads en C ?

Quintoff
Quintoff
Niveau 10
29 mars 2005 à 20:20:11

Ben je suis pas trop sur ( moi je code en Java => POO

Mais la musique doit se faire dans un thread séparer pour que la musique et l´affichage tourne en meme temps.

Moi j´aurait faut une classe :

public class Musique extends Thread {

public void run() {

. ..

}

}

Quintoff
Quintoff
Niveau 10
29 mars 2005 à 20:22:30

Ah autant pour moi je croyait qu´il y avait de thread :honte: lol

Perdu_de_linfo
Perdu_de_linfo
Niveau 9
29 mars 2005 à 20:24:08

Ok, je vais essayer de trouver qq chose de plus rapide.
Si qqn peut m´indiquer une lib ou quoi que ce soit, je l´en remercie d´avance :)

Quintoff
Quintoff
Niveau 10
29 mars 2005 à 20:25:07

Vengeur41 => il y en a pas en C mais en C++ bien je suppose...

Ruffi
Ruffi
Niveau 9
29 mars 2005 à 20:27:19

En c++, il n´y a pas de classe thread, il faut la faire soit meme. Mais il n´y a pas besoin de threader, fmod lit le son sans bloquer le programme.

Sinon, le mieu est de faire une classe pour ta music, avec en static une fonction pour initialiser fmod, et en donnée membre les info de chacune de tes music ( afin de l´areter, de l´avancer de la lire en boucle...). Sa te permet de charger les son en debut de programme, de les lire quand tu en a envi, et de les supprimer a la fin proprement.
En tout cas, c´est comme ça que je le gerre :)

Ruffi
Ruffi
Niveau 9
29 mars 2005 à 20:29:22

Vengeur : oui, il y a des thread en c, mais c´est pas orienté objet.

Si le sujet t´interesse : http://www.flipcode.com/articles/article_multithreading.shtml

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment