为什么我的 NAudio 音乐在我的游戏中 CPU 使用高峰时冻结?
Why does my NAudio music freeze when CPU usage spikes in my game?
我正在编写游戏并尝试使用 NAudio 来播放音乐和音效,但是当游戏使用大量 CPU 时,音乐会卡住。我在单独的线程中尝试 运行 音乐,但这似乎没有帮助。如何防止音乐冻结?
这是我的音乐播放代码:
// (code to select a track goes here)
// prepare the new track
var tl = trackname.ToLower();
var path = Path.Combine("Music", trackname);
IWaveProvider p;
if (tl.EndsWith("ogg"))
p = new VorbisWaveReader(path);
else if (tl.EndsWith("mp3"))
p = new Mp3FileReader(path);
else if (tl.EndsWith("wav"))
p = new WaveFileReader(path);
else
throw new Exception("Unknown audio format for file " + path);
waveout.Stop();
if (CurrentMode == MusicMode.None)
return; // no music!
// fade between the two tracks
prevTrack = curTrack;
if (prevTrack != null)
prevTrack.BeginFadeOut(FadeDuration);
curTrack = new FadeInOutSampleProvider(p.ToSampleProvider(), true);
curTrack.BeginFadeIn(FadeDuration);
// start playing
// TODO - start fade of new track even before old track is done?
if (prevTrack != null)
waveout.Init(new MixingSampleProvider(new ISampleProvider[] { curTrack, prevTrack }));
else
waveout.Init(curTrack);
waveout.Play();
waveout.PlaybackStopped += waveout_PlaybackStopped;
WaveOut
是什么类型?使用 WaveOutEvent
将在后台线程上播放音频。
此外,在同一个 WaveOut
实例上第二次调用 WaveOut.Init
不是 NAudio 官方支持的,可能会导致奇怪的事情发生。
提高音频性能的主要途径有:
- 以更高的延迟运行
- 最大限度地减少音频引擎需要做的工作(例如,将音频从自定义格式预解压缩为 PCM 并将其存储在内存中)
对于您的场景,最好的办法可能是创建一个自定义交叉淡入淡出示例提供程序。不幸的是,目前 NAudio 中还没有,但这对未来的博客 post / 代码示例来说是个好主意,所以我会把它放在要写的内容列表中。
我正在编写游戏并尝试使用 NAudio 来播放音乐和音效,但是当游戏使用大量 CPU 时,音乐会卡住。我在单独的线程中尝试 运行 音乐,但这似乎没有帮助。如何防止音乐冻结?
这是我的音乐播放代码:
// (code to select a track goes here)
// prepare the new track
var tl = trackname.ToLower();
var path = Path.Combine("Music", trackname);
IWaveProvider p;
if (tl.EndsWith("ogg"))
p = new VorbisWaveReader(path);
else if (tl.EndsWith("mp3"))
p = new Mp3FileReader(path);
else if (tl.EndsWith("wav"))
p = new WaveFileReader(path);
else
throw new Exception("Unknown audio format for file " + path);
waveout.Stop();
if (CurrentMode == MusicMode.None)
return; // no music!
// fade between the two tracks
prevTrack = curTrack;
if (prevTrack != null)
prevTrack.BeginFadeOut(FadeDuration);
curTrack = new FadeInOutSampleProvider(p.ToSampleProvider(), true);
curTrack.BeginFadeIn(FadeDuration);
// start playing
// TODO - start fade of new track even before old track is done?
if (prevTrack != null)
waveout.Init(new MixingSampleProvider(new ISampleProvider[] { curTrack, prevTrack }));
else
waveout.Init(curTrack);
waveout.Play();
waveout.PlaybackStopped += waveout_PlaybackStopped;
WaveOut
是什么类型?使用 WaveOutEvent
将在后台线程上播放音频。
此外,在同一个 WaveOut
实例上第二次调用 WaveOut.Init
不是 NAudio 官方支持的,可能会导致奇怪的事情发生。
提高音频性能的主要途径有:
- 以更高的延迟运行
- 最大限度地减少音频引擎需要做的工作(例如,将音频从自定义格式预解压缩为 PCM 并将其存储在内存中)
对于您的场景,最好的办法可能是创建一个自定义交叉淡入淡出示例提供程序。不幸的是,目前 NAudio 中还没有,但这对未来的博客 post / 代码示例来说是个好主意,所以我会把它放在要写的内容列表中。