4

对于我正在开发的游戏,我想将音频放到另一个线程上,这样我就可以将声音排队并让它们立即播放。我在该线程中使用的代码如下所示

private void _checkForThingsToPlay()
{
    while (true)
    {
        if (_song != null)
        {
            _playSong(_song);
            _song = null;
        }

        while (_effects.Count > 0)
            _playSfx(_effects.Dequeue());

        Thread.Sleep(100);
    }
}

这异步运行并且运行良好。但是,如果没有睡眠调用,它会占用 cpu 上的整个核心。我的问题是, sleep() 是降低 CPU 使用率的有效方法还是有更好的方法来做到这一点?我和我的朋友觉得这是一个快速破解。

4

2 回答 2

7

Thread.Sleep()while(true)循环中使用通常是一个坏习惯。看起来您有一个要在其上推送声音效果的队列,并且您希望“音频线程”在它们被推送到队列后立即播放这些效果。这听起来像一个生产者/消费者队列。有多种方法可以在 C# 中构建这样的队列。你可以使用Monitor.Wait()andMonitor.Pulse()或者你可以使用一个AutoResetEvent对象。

在 .NET 4 中,您还可以使用BlockingCollection.

顺便说一句,有一个很好的在线介绍C#中的线程,描述了很多常见的线程/同步场景和最佳实践。

于 2012-06-11T02:07:40.183 回答
5

这称为生产者-消费者问题,很容易解决。如果您使用的是 .NET 4,请尝试BlockingCollection. MSDN 页面中有一个很好的示例代码。

请注意示例代码中的这一行:

while (true) Console.WriteLine(bc.Take());

这实际上会阻塞(没有浪费 CPU 周期),直到有东西可以消耗

于 2012-06-11T02:07:05.113 回答