「VeldridでFenceを使う」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
(ページの作成:「一定間隔でUpdate()とDraw()が呼ばれる以下のような実装があるとする。 この際にFenceを使うことで「CPUがメインのUpdate()」と「…」)
 
 
1行目: 1行目:
 
一定間隔でUpdate()とDraw()が呼ばれる以下のような実装があるとする。
 
一定間隔でUpdate()とDraw()が呼ばれる以下のような実装があるとする。
この際にFenceを使うことで「[[CPU]]がメインのUpdate()」と「[[GPU]]がメインのDraw()」を[[マルチスレッド]]を使わずに並走させることができる。
+
この際に[[Fence]]を使うことで「[[CPU]]がメインのUpdate()」と「[[GPU]]がメインのDraw()」を[[マルチスレッド]]を使わずに並走させることができる。
 
SubmitCommands()した内容が別スレッド(GPU)で実行され、処理が終わるとFenceが[[シグナル状態]]になる感じだ。
 
SubmitCommands()した内容が別スレッド(GPU)で実行され、処理が終わるとFenceが[[シグナル状態]]になる感じだ。
  

2021年2月5日 (金) 05:55時点における最新版

一定間隔でUpdate()とDraw()が呼ばれる以下のような実装があるとする。 この際にFenceを使うことで「CPUがメインのUpdate()」と「GPUがメインのDraw()」をマルチスレッドを使わずに並走させることができる。 SubmitCommands()した内容が別スレッド(GPU)で実行され、処理が終わるとFenceがシグナル状態になる感じだ。

class App 
{
    Sdl2Window     _window;
    GraphicsDevice _graphicsDevice;
    Fence          _drawFence;

    // 初期化
    void Initialized()
    {
        // WindowとGraphicsDeviceを生成
        CreateWindow();
        CreateGraphicsDevice();

        // 
        var factory = _graphicsDevice.ResourceFactory;

        // CommandListを作る
        _commandList = factory.CreateCommandList();

        // Fenceを作る
        _drawFence = factory.CreateFence(signaled:true);
    }

    //  一定間隔で呼ばれる
    void Update()
    {
    }

    //  一定間隔で呼ばれる
    void Draw() 
    {
        // 前回のDraw()が終わるまで待つ
        _graphicsDevice.WaitForFence(_drawFence);

        // Fenceを再利用
        _drawFence.Reset();

        // --------------------------------

        // 描画コマンドを組み立て
        _commandList.Begin();
            // 〜〜〜 省略 〜〜〜
        _commandList.End();
        
        // 描画コマンドを送信
        _graphicsDevice.SubmitCommands(_commandList, _drawFence);
        
        // Fenceを使う場合はここで描画完了を待たない。
        // Fenceを使わず描画完了を待つ場合は以下をコメントアウト
        //_graphicsDevice.WaitForIdel();
    }
}