「コマンドキュー」の版間の差分
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| (同じ利用者による、間の7版が非表示) | |||
| 1行目: | 1行目: | ||
'''コマンドキュー'''(英語:command queue)とは、特定のコマンド(処理)を[[キュー]]に格納しておくと、別の[[プロセス]]や[[スレッド]]が適宜それを取り出して実行する方式のことである。 | '''コマンドキュー'''(英語:command queue)とは、特定のコマンド(処理)を[[キュー]]に格納しておくと、別の[[プロセス]]や[[スレッド]]が適宜それを取り出して実行する方式のことである。 | ||
名称に「[[キュー]]」とあるが、ほとんどの実装は[[アルゴリズム]]の教科書に載っているような単純なキューではなく、キューの中においてコマンドの実行順序を並べ替えたりコマンドを結合したりといった[[最適化]]が行われているものが多い。 | |||
[[マルチスレッド]]における「[[スレッドプール]]」もほぼ同じ概念である。スレッドプールでは汎用的な処理を格納することができるが、コマンドキューの場合は前述のような最適化が行いやすいように単純なコマンドであることが多い。 | [[マルチスレッド]]における「[[スレッドプール]]」もほぼ同じ概念である。スレッドプールでは汎用的な処理を格納することができるが、コマンドキューの場合は前述のような最適化が行いやすいように単純なコマンドであることが多い。 | ||
| 13行目: | 13行目: | ||
=== GPUのコマンドリスト === | === GPUのコマンドリスト === | ||
最近の[[GPU]] | 最近の[[GPU]]では「1フレーム分の描画処理」をコマンドキューに格納して実行する方式が主流となっている。こちらは「[[CPU]]が[[GPU]]の処理完了を待たないための機構」という意味合いが強く、GPUが別スレッドのような扱いになる。 | ||
架空のコマンドセットを示す。 | |||
<source lang="csharp"> | |||
void Draw() { | |||
// コマンドリストを作る | |||
var cl = new CommandList(); | |||
cl.Add(new SetFrameBufferCommand()); // フレームバッファをセットする | |||
cl.Add(new ClearCommand() ); // フレームバッファをクリアする | |||
// コマンドキューに格納する | |||
GraphicsDevice.SubmitCommands(cl); | |||
// ここでGPUでの処理完了を待てば従来同様になる。 | |||
// ただWaitForIdle()している間はCPUが遊んでしまう。 | |||
GraphicsDevice.WaitForIdle(); | |||
} | |||
</source> | |||
[[GPU]]での描画処理の場合は、前回の描画処理が未完了なのに次の描画処理を始めると残念なことになる。そこで「[[フェンス]]」と呼ばれる[[シグナル状態]]を保持する[[変数]]を用いて適切に処理する必要がある。 | |||
<source lang="csharp"> | |||
var fence; | |||
void Init() { | |||
fence = GraphicsDevice.CreateFence(); | |||
} | |||
void Draw() { | |||
// 前回の処理完了を待つ | |||
// ここで待たずにフレームスキップするのも手である。 | |||
//if (!fence.Signaled) | |||
// return; | |||
GraphicsDevice.WaitForFence(fence); | |||
// コマンドリストを作る | |||
var cl = new CommandList(); | |||
cl.Add(new SetFrameBufferCommand()); // フレームバッファをセットする | |||
cl.Add(new ClearCommand() ); | |||
// コマンドキューに格納する | |||
GraphicsDevice.SubmitCommands(cl, fence); | |||
// ここで待たないのが重要 | |||
} | |||
</source> | |||
== 関連項目 == | |||
* [[VeldridでFenceを使う]] | |||
* [[シグナル状態]] | |||
[[category: 並行処理]] | |||