Je viens solliciter votre aide car je n'arrive pas à trouver de solution à mon problème. Je suis en train de coder un petit jeu 2D et je suis arrivé à un point où je voulais rajouter la musique de fond en utilisant SDL_mixer, ce qui entraîne parfois un changement de musique lors d'un changement de map. Et c'est là que le problème se pointe : le délai entre les deux musiques est assez important (en moyenne 500 ms), ce qui entraîne des changements de map plus long, ce qui n'est pas fluide et agréable (j'ai volontairement mis le changement de musique dans la boucle principale, pour qu'il se déclenche à un moment précis).
J'ai essayé d'isoler le problème dans un petit programme test afin d'essayer de trouver une solution, mais rien à faire, je tourne toujours aux alentours de 500ms de délai.
Voici le programme test :
#define _CRT_SECURE_NO_DEPRECATE
#include <SDL2/SDL.h>
#include <SDL2/SDL_mixer.h>
#include <stdlib.h>
#include <stdio.h>
#include "input.h"
int main(int argc, char** argv)
{
(void)argc, argv;
// Init SDL
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *jeu = SDL_CreateWindow("Jeu", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 240, 160, 0);
// Init input
Input I; InitEvents(&I);
// Init compteurs
Uint32 tempsPrecedent = 0 , tempsActuel = 0;
// Init audio
Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 1024);
Mix_Music *musique[2];
musique[0] = Mix_LoadMUS("audio/map_song/PkmRB-Celadon.mid");
musique[1] = Mix_LoadMUS("audio/map_song/PkmRB-1.mid");
// Boucle principale
while (!I.key[SDL_SCANCODE_TAB] && !I.quit)
{
UpdateEvents(&I);
if (I.key[SDL_SCANCODE_SPACE]) // Si on appuie sur la barre d'espace, on joue la première musique
{
tempsPrecedent = SDL_GetTicks();
Mix_PlayMusic(musique[0], -1);
tempsActuel = SDL_GetTicks();
printf("TEMPS MIS : %d\n", tempsActuel - tempsPrecedent);
}
else if (I.key[SDL_SCANCODE_RETURN]) // Si on appuie sur entrée, on joue la deuxième musique
{
tempsPrecedent = SDL_GetTicks();
Mix_PlayMusic(musique[1], -1);
tempsActuel = SDL_GetTicks();
printf("TEMPS MIS : %d\n", tempsActuel - tempsPrecedent);
}
SDL_Delay(1);
}
Mix_FreeMusic(musique[0]);
Mix_FreeMusic(musique[1]);
Mix_CloseAudio();
SDL_Quit();
return 0;
}
Les musiques sont pourtant chargées en mémoire dès l'init, elles ont en théorie juste besoin d'être lancées, et je trouve ça étrange que ça mette autant de temps, à moins que je loupe quelque chose ? Y a-t-il un moyen de réduire ce temps ? Ou est ce que je dois oublier SDL_mixer pour me tourner vers quelque chose de plus performant ?
Si vous pouviez m'éclairer sur ce point ça serait super
Le "else if" me permet de passer d'une musique à l'autre afin d'avoir une idée du temps moyen entre chaque changement de musique. Supprimer le SDL_Delay ne change rien au problème malheureusement... Après plusieurs essais j'ai l'impression que SDL_mixer met le programme tout entier en pause le temps que la musique soit lancée (j'ai essayé de sortir le lancement de musique de la boucle principale et de mettre ça dans un thread secondaire, mais le problème est toujours présent...)
SDL_mixer et changement de musique
× 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.
Installer la SDL 1.2 avec CodeBlocks sous Windows. Installer la SDL 2.0 avec CodeBlocks sous Windows.