我正在使用 Visual C# Express 在 xna 中为 Windows 创建游戏。在游戏中,有六个 SoundEffect 对象定期调用它们的 Play() 方法。问题是有时当游戏关闭时它会崩溃。 只要在播放音效时关闭窗口,就会发生这种情况。这是在 Visual C# 中弹出的消息:
AccessViolationException 未处理
试图读取或写入 protected 内存。这通常表明其他内存已损坏。
visual studio 中没有任何可用于调试的源代码,当单击“获取此异常的一般帮助”时,会弹出一个空白页面。
使用的代码看起来很像 MSDN 示例。这看起来像是底层框架某处存在的问题,而不是我的代码。但我当然不确定。这已经发生过很多次了。
http://msdn.microsoft.com/en-us/library/bb195053.aspx
以下是完整的异常详细信息:
System.AccessViolationException was unhandled
Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Source=Microsoft.Xna.Framework
StackTrace:
at Microsoft.Xna.Framework.Audio.AudioCallbackDispatcher.IsEventRegistered(EventType type)
at Microsoft.Xna.Framework.Audio.AudioCallbackDispatcher.UnregisterEvent(EventType type)
at Microsoft.Xna.Framework.Audio.KernelMicrophone.ShutdownCaptureEngine()
at Microsoft.Xna.Framework.Audio.MicrophoneUnsafeNativeMethods.ShutdownCaptureEngine()
at Microsoft.Xna.Framework.Audio.AudioRendererShutdownHandler.AppExitingEventHandler(Object sender, EventArgs args)
InnerException:
(我也有通过 MediaPlayer 播放音乐,但我认为这没有关系。)
编辑:我似乎找到了一些有用的东西,但它有点老套,真的没有必要。我仍然愿意接受任何更优雅的解决方案。
在 Game1.UnloadContent() 中调用这一行。它将确保(如果您的音效都短于 3 秒)当程序实际关闭时没有声音播放。
System.Threading.Thread.Sleep(3000);
最佳答案
使 SoundEffect 对象成为类成员并在类解构时调用 SoundEffect 的 Dispose() 方法:
class MyClass
{
~MyClass()
{
effect.Dispose();
}
SoundEffect effect;
}
这应该让 SoundEffect 对象在您关闭游戏时自行清理。您可以在此处阅读有关一次性对象的信息:http://msdn.microsoft.com/en-us/library/system.idisposable.aspx
关于c# - 您如何阻止 SoundEffect 在 XNA windows 游戏关闭时崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5108419/