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()Monitor.Pulse()たりできAutoResetEventます。

.NET 4 では、.NET も使用できますBlockingCollection

ところで、C#でのスレッド化に関する非常に優れたオンライン入門書があり、多くの一般的なスレッド化/同期シナリオとベスト プラクティスが説明されています。

于 2012-06-11T02:07:40.183 に答える
5

これは生産者と消費者の問題と呼ばれ、簡単に解決できます。.NET 4 を使用している場合は、 を試してくださいBlockingCollectionMSDN ページに良いサンプル コードがあります。

サンプル コードの次の行に注意してください。

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

消費するものがあるまで、実際にはブロックされます (無駄な CPU サイクルはありません) 。

于 2012-06-11T02:07:05.113 に答える