3

我在使用 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 中寻找下一个可用的空闲内存,因此程序的内存使用不会停止增加。我认为也许在每次播放后使用“释放”方法会起作用,但后来我注意到释放释放了声音实例中的所有内存。

谁能给我一些关于我在这里做错了什么的指示?我该如何防止这种情况?我不确定我是否说得足够清楚。在此先感谢您的帮助。

4

1 回答 1

1

每次调用 pAudio->LoadMusic 时,您都会分配(泄漏)更多内存,因为您正在创建一个新的 FMOD::Sound 实例(正如您所指出的那样,它有自己的流缓冲区)。如果您只是想再次播放声音,只需调用 pAudio->Play 即可重新启动流。

如果您担心 FMOD 内存使用情况,您可以调用 Memory_GetStats 来监控它,以防万一我错过了您的使用情况以及其他原因导致泄漏。

于 2012-12-20T11:04:50.343 回答