我使用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流的小缓冲区而发生的,因此,它在RAM中寻找下一个可用的免费内存,因此该程序的内存使用不停增加。我以为每次播放都可以使用"释放"方法,但是后来我注意到该版本在声音实例中释放了所有内存。
谁能给我一些指示,说明我在这里做错了什么?我如何防止这种情况?我不确定我是否已经足够清楚了。预先感谢您的帮助。
每次调用paudio-> loadMusic时,您都会分配(泄漏)更多内存,因为您正在创建一个新的fmod :: sound实例(如您所示,它具有其自己的流缓冲区)。如果您只想再次播放声音,只需致电Paudio->播放,并且流将重新启动。
如果您担心FMOD内存使用量,则可以调用Memory_getStats进行监视,以防万一我错过了您的用法,而其他可能导致泄漏。