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 に答える