对于我正在开发的游戏,我想将音频放在另一个线程上,这样我就可以对声音进行排队并让它们立即播放。我在该线程中使用的代码如下所示
private void _checkForThingsToPlay()
{
while (true)
{
if (_song != null)
{
_playSong(_song);
_song = null;
}
while (_effects.Count > 0)
_playSfx(_effects.Dequeue());
Thread.Sleep(100);
}
}
这是异步运行的,并且运行良好。但是,如果不调用 sleep ,它会占用 CPU 上的整个核心。我的问题是,sleep() 是降低 CPU 使用率的有效方法还是有更好的方法来做到这一点?我和我的 friend 觉得这是一个快速的技巧。
最佳答案
在 while(true)
循环中使用 Thread.Sleep()
通常是个坏习惯。看起来您有一个要在其上推送声音效果的队列,并且您希望“音频线程”在将这些效果插入队列后立即播放这些效果。这听起来像 producer/consumer queue .有多种方法可以在 C# 中构建这样的队列。您可以使用 Monitor.Wait()
和 Monitor.Pulse()
或者您可以使用 AutoResetEvent
对象。
在 .NET 4 中,您还可以使用 BlockingCollection
。
对了,threading in C#网上有很好的介绍描述了许多常见的线程/同步场景和最佳实践。
关于c# - 线程和 sleep (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10973794/