3

Instruments を実行していますが、SimpleAudioEngine がメモリ リークしていることを示しています。スクリーンショットを添付します。スクリーンショットには 1 つのインスタンスしか表示されていませんが、メモリ リークは複数回発生しています。 ここに画像の説明を入力

また、次の実装 (私のコード) を指す場合もあります。

-(void) preloadGameSounds
{
    // pre load the background sound 

    [[SimpleAudioEngine sharedEngine] preloadEffect:@"farm_background_sound.mp3"];

    // pre load the game sounds 

    [[SimpleAudioEngine sharedEngine] preloadEffect:@"chickenlayingegg.mp3"];

    // setup ding sound 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"ding.caf"];

    // egg pop sound 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"baloonpop.wav"];

    // preload applause sound 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"applause.mp3"];

    // wrong answer sound 
    [[SimpleAudioEngine sharedEngine] preloadEffect:@"wrong_answer_sound.wav"];

}

シーンを変更するときは、次の実装を使用してサウンドもアンロードします。

-(void) unloadSoundEffects 
{

    [[SimpleAudioEngine sharedEngine] unloadEffect:@"applause.mp3"];
    //[[SimpleAudioEngine sharedEngine] unloadEffect:@"wrong_answer_sound.wav"];
    [[SimpleAudioEngine sharedEngine] unloadEffect:@"ding.caf"];

    [[SimpleAudioEngine sharedEngine] unloadEffect:@"chickenlayingegg.mp3"];
}

このメモリ リークにより、ゲームの FPS が低下し、ゲームがますます遅くなります。

4

2 に答える 2

2

cocosdenshion FAQから:

何を保持/解放する必要がありますか?

SimpleAudioEngine、CDAudioManager、およびCDSoundEngine APIはすべて、共有シングルトンインスタンスを介してアクセスされます。これは、CocoaTouchとcocos2d全体で使用される一般的なパターンです。共有インスタンスを保持または解放しないでください。

CocosDenshionを完全にシャットダウンし、使用していたすべてのリソースを解放する必要がある場合は、使用している最高レベルのAPIでendメソッドを呼び出します。たとえば、SimpleAudioEngineを使用している場合は、[SimpleAudioEngineend]を呼び出すだけです。

CDSoundSourceオブジェクトを使用する場合は、soundSourceForFileなどのファクトリメソッドの1つを介してオブジェクトを取得する必要があります。返されるCDSoundSourceは自動解放されます。つまり、現在のメソッドの範囲外で使用する場合は、それを保持する必要があります。CDSoundSourceを保持している場合は、使用が終了したら解放する必要があります。

于 2011-07-04T14:15:28.317 に答える
0

シミュレーターを使用してリークツールを実行していますか? シミュレーターで同じリークが発生しますが、デバイスでは発生しません。デバイスを使用してリーク ツールを実行してみてください

于 2011-03-09T03:37:05.773 に答える