У меня есть определенная проблема при использовании FmodEx. Я тщательно искал по сети, чтобы увидеть, есть ли у кого-то моя проблема, но я не нашел ничего связанного с этим.
Я создал класс, который загружает и воспроизводит мои звуки, в данном случае потоковые. Вот мой код:
Audio::Audio()
{
//Create system object//
m_Result = FMOD::System_Create(&m_pSystem);
ErrorCheck(m_Result);
//Check FMOD version//
m_Result = m_pSystem->getVersion(&m_FmodVersion);
if(m_FmodVersion < FMOD_VERSION)
MessageBox(NULL, FMOD_ErrorString(m_Result), "FMOD Version Error", MB_OK);
//Check if hardware acceleration is disabled//
m_pSystem->getDriverCaps(0, &m_Caps, 0, &m_SpeakerMode);
if (m_Caps & FMOD_CAPS_HARDWARE_EMULATED)
MessageBox(NULL, FMOD_ErrorString(m_Result), "FMOD Acceleration Error", MB_OK);
//Initialize system object//
m_Result = m_pSystem->init(2, FMOD_INIT_NORMAL, 0);
ErrorCheck(m_Result);
m_pChannel = 0;
m_IsLoaded = false;
}
void Audio::LoadMusic(char *filename)
{
m_Result = m_pSystem->createStream(filename, FMOD_CREATESTREAM, 0, &m_pSound);
ErrorCheck(m_Result);
}
void Audio::Play()
{
SetPause(false);
m_Result = m_pSystem->playSound(FMOD_CHANNEL_FREE, m_pSound, false, &m_pChannel);
ErrorCheck(m_Result);
SetPause(true);
}
После этого я просто делаю:
pAudio->LoadMusic("test.mp3");
pAudio->Play();
Звук играет без проблем. Проблема возникает при загрузке потока. Используемая память постоянно увеличивается и не останавливается. Я предполагаю, что это происходит из-за того, что небольшой буфер, используемый для чтения потока mp3, не освобождается, поэтому он ищет следующий доступный фрагмент свободной памяти в ОЗУ, поэтому использование программы программой не прекращается. растет.
Я подумал, что, возможно, использование метода «release» после каждой игры будет работать, но потом я заметил, что release освобождает ВСЕ память в экземпляре звука.
Может ли кто-нибудь дать мне несколько советов о том, что я здесь делаю неправильно? Как мне это предотвратить?
Я не уверен, сделал ли я это достаточно ясно или нет.
Заранее спасибо за помощь.
Каждый раз, когда вы вызываете pAudio-> LoadMusic, вы будете выделять (пропускать) больше памяти, потому что вы создаете новый экземпляр FMOD :: Sound (который, как вы указываете, имеет свой собственный буфер потока). Если вы просто хотите воспроизвести звук снова, просто вызовите pAudio-> Play, и поток возобновится.
Если вас беспокоит использование памяти FMOD, вы можете вызвать Memory_GetStats для ее мониторинга, на случай, если я неправильно понял ваше использование и что-то еще вызывает утечку.
Других решений пока нет …