1

std::async の呼び出しはどのくらい効率的ですか? ゲームループでタスクを発行するために使用できますか?

すべての入力検出を別のスレッドに配置し、メイン スレッドのゲーム ループの特定の時点で同期して、入力をポーリングできるようにしたいと考えています。

私がこれを行うと考えることができる唯一の方法は、入力検出のためにタスクを分割しstd::async、実際のゲームループの開始時にそれらを使用して呼び出し、wait()後でループ内で呼び出してデータを同期することですが、反復ごとに同じ動作が必要ですループの呼び出しなので、この呼び出しは高価でなければなりません...

その通りですか?

4

2 に答える 2

3

少なくともIMOでは、ポーリングと非同期操作の間で決心する必要があります。

ポーリングする場合、使用std::asyncは冗長です。とにかくメインスレッドからポーリングするので、関心のあることを直接ポーリングして処理を終了することもできます。を使用std::asyncして何か他のものを起動すると、メイン スレッドにデータを取得する際に遅延が追加されるだけです。

を使用する場合std::asyncは、かなり異なるアプローチを取る必要があります。入力を取得するスレッドは独立して動作します。入力を見つけると、それをメイン スレッドに送信し、処理する入力があることを伝えます (たとえば、セマフォを設定することによって)。次に、メイン スレッドがそのセマフォに反応し、入力データを (キューなどから) 取得して処理します。

後者の場合、ポーリングは無意味です。入力スレッドが入力データについてメイン スレッドに伝えていない場合は、何もありません。その場合、入力データのポーリングは無意味です。何もないことはすでにわかっています。

于 2012-12-13T04:48:57.843 に答える