「コマンドキュー」の版間の差分

ページの作成:「'''コマンドキュー'''(英語:command queue)とは、特定のコマンド(処理)をキューに格納しておくと、別のプロセスやス…」
 
編集の要約なし
14行目: 14行目:
=== GPUのコマンドリスト ===
=== GPUのコマンドリスト ===
最近の[[GPU]]では1フレームの描画処理をコマンドキューに格納して実行する方式が主流となっている。こちらは「[[CPU]]が[[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); 
    // ここで処理完了を待てば従来同様になる。
    // ただ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);
   
    // ここで待たないのが重要
}
== 関連項目 ==
* [[VeldridでFenceを使う]]
* [[シグナル状態]]