C# 经常玩AVAudioPlayers会导致SIGSEGV吗?

C# 经常玩AVAudioPlayers会导致SIGSEGV吗?,c#,xamarin.ios,avaudioplayer,segmentation-fault,xamarin-studio,C#,Xamarin.ios,Avaudioplayer,Segmentation Fault,Xamarin Studio,我正在Xamarin Studio中开发一款iOS游戏,遇到了一个崩溃&aSIGSEGV。我正在使用AVAudioPlayer播放音效。基本上我给了一个士兵一种快速开火的能力!当压力测试这种能力时,我遇到了SIGSEGV。我可以在我的项目中成功地复制它。基本上,如果我把所有的音效都注释掉,碰撞就永远不会发生。如果我不播放音效,就会发生碰撞 我的项目正在崩溃,只给了我以下信息: 2014-03-19 18:03:08.304 CyCom[5666:131a3] 18:03:08.303 ERROR

我正在Xamarin Studio中开发一款iOS游戏,遇到了一个崩溃&aSIGSEGV。我正在使用AVAudioPlayer播放音效。基本上我给了一个士兵一种快速开火的能力!当压力测试这种能力时,我遇到了SIGSEGV。我可以在我的项目中成功地复制它。基本上,如果我把所有的音效都注释掉,碰撞就永远不会发生。如果我不播放音效,就会发生碰撞

我的项目正在崩溃,只给了我以下信息:

2014-03-19 18:03:08.304 CyCom[5666:131a3] 18:03:08.303 ERROR:     >aqsrv> 65: Exception caught in (null) - error -66634
mono-rt: Stacktrace:


mono-rt:   at <unknown> <0xffffffff>

mono-rt:   at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff>

mono-rt:   at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38

mono-rt:   at CyCom.Application.Main (string[]) [0x00012] in /Users/jzacherl/Projects/CyCom/CyCom/CyCom/Main.cs:20

mono-rt:   at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

mono-rt: 
Native stacktrace:


mono-rt: 

Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
关于罗尔夫的评论:

关于罗尔夫的评论:

关于Choper的评论:我更换了所有球员。Play();使用以下代码:

PlayThisAudioPlayer(player);
以下是功能:

public static void PlayThisAudioPlayer( AVAudioPlayer player )
    {
        AppDelegate appDel = (AppDelegate)UIApplication.SharedApplication.Delegate;

        player.FinishedPlaying += CreateFinishedPlayingEvent(player);

        player.Play();
    }


    public static EventHandler<AVStatusEventArgs> CreateFinishedPlayingEvent ( AVAudioPlayer player )
    {
        EventHandler<AVStatusEventArgs> finishedPlayingEvent;
        finishedPlayingEvent = delegate(object sender, AVStatusEventArgs e) {
            player.Stop();
            player.FinishedPlaying -= finishedPlayingEvent;
            player.Dispose();
            player = null;
        };

        return finishedPlayingEvent;
    }
不过还有一点:我想问题可能是我使用的是静态函数。。。。现在正试图证明这是真是假


我在这里给Choper打了勾,因为问题在于我重复使用了Avaudioplayer,而不是使用它们。无论出于何种原因,您都无法长时间持续重复使用AvaudioPlayer。我不知道为什么,但事实证明这很糟糕!我重新设计了我的代码,以便在需要时创建AVAudio播放器,然后通过后台线程进行处理

将此项添加到您的代码中:

audioPlayer.FinishedPlaying += HandleAudioFinished;

...

private void HandleAudioFinished (object sender, AVStatusEventArgs e) 
{
    if (audioPlayer != null)
    {
        audioPlayer.Stop();
        audioPlayer.FinishedPlaying -= HandleAudioFinished;
        audioPlayer.Dispose();
        audioPlayer = null;
    }
}

我不能为了我的比赛这么做。在游戏过程中创建和处理AvaudioPlayer的过程会在游戏过程中产生不必要的重复CPU使用。相反,在加载时,我会创建一个AvaudioPlayer列表,在整个游戏过程中使用。直到比赛结束,他们才被处理掉。阅读我的代码,“GetNextAudioPlayer_General”函数将获取“SoundEffecterPlayerList_General”音频播放器列表中可用的下一个音频播放器。我从来没有遇到过这个问题,直到我开始滥发声音。垃圾声音仍然只是重复使用同一池约40个播放器Disposing audioPlayer对象不会处理列表中的项目。关于这一点,有几个问题:因为我每次播放声音都调用“AVAudioPlayer.FromData()”,它是否使用全新的音频播放器?还是同一个音频播放器只是一个不同的媒体文件?我以为是晚些时候。但我是否需要在每次播放时设置已创建事件的HandleAudio?或者我可以在初始化时设置一次事件,然后在准备播放时通过“AVAudioPlayer.FromData()”更改媒体文件。Choper,请参见上面我写的“关于Choper的评论:”我尝试了你写的内容,但现在得到了不同类型的崩溃。你有什么类型的崩溃?你能发布崩溃报告吗?你应该在Mac的控制台应用程序中找到它们。上面我添加了一个指向Mac控制台应用程序中ASI文件的链接。如果这不是你想要的,请告诉我。最后显示“应用程序'UIKitApplication:com.joey.cycom[0xd249]”异常退出,信号为6:Abort trap:6“你在控制台应用程序左侧的“用户诊断报告”树节点下没有得到任何.crash文件吗?我在上面添加了.crash文件。你有多少个音频播放器?是不是你用完了所有的音频播放器,在播放器还没用完之前就开始重复使用?
2014-03-20 11:09:37.568 CyCom[5533:a0b] EXCEPTION IN THE MAIN.CS
2014-03-20 11:09:37.569 CyCom[5533:a0b] the player object was Dispose()d during the callback, this has corrupted the state of the program
2014-03-20 11:09:37.569 CyCom[5533:a0b]   at MonoTouch.AVFoundation.InternalAVAudioPlayerDelegate.FinishedPlaying (MonoTouch.AVFoundation.AVAudioPlayer player, Boolean flag) [0x00032] in /Developer/MonoTouch/Source/maccore/src/AVFoundation/Events.cs:72 
at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38 
at CyCom.Application.Main (System.String[] args) [0x00013] in /Users/jzacherl/Projects/CyCom/CyCom/CyCom/Main.cs:23 
audioPlayer.FinishedPlaying += HandleAudioFinished;

...

private void HandleAudioFinished (object sender, AVStatusEventArgs e) 
{
    if (audioPlayer != null)
    {
        audioPlayer.Stop();
        audioPlayer.FinishedPlaying -= HandleAudioFinished;
        audioPlayer.Dispose();
        audioPlayer = null;
    }
}