3

我正在运行 Instruments,它表明 SimpleAudioEngine 正在泄漏内存。附上截图。尽管屏幕截图只显示了一个实例,但内存泄漏是多次的。 在此处输入图像描述

此外,有时它指向以下实现(我的代码):

-(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 常见问题解答

我应该保留/释放什么?

SimpleAudioEngine、CDAudioManager 和 CDSoundEngine API 都通过共享单例实例访问。这是 Cocoa Touch 和 cocos2d 中使用的常见模式。不应保留或释放共享实例。

如果您需要完全关闭 CocosDenshion 并释放它正在使用的所有资源,请在您正在使用的最高级别 API 上调用 end 方法。例如,如果您使用的是 SimpleAudioEngine,那么只需调用 [SimpleAudioEngine end] 即可

如果您使用 CDSoundSource 对象,您必须通过其中一种工厂方法获取它们,例如 soundSourceForFile。返回的 CDSoundSource 是自动释放的,这意味着如果您想在当前方法的范围之外使用它,则必须保留它。如果您保留 CDSoundSource,您应该在使用完毕后释放它。

于 2011-07-04T14:15:28.317 回答
0

您是否使用模拟器来运行泄漏工具?我在模拟器中遇到了同样的泄漏,但在设备上没有。尝试使用设备运行泄漏工具

于 2011-03-09T03:37:05.773 回答