2

Microsoft のサンプル例で次のことがわかりました。

void D3D12HelloTriangle::OnRender()
{
// Record all the commands we need to render the scene into the command list.
PopulateCommandList();

// Execute the command list.
ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() };
m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);

// Present the frame.
ThrowIfFailed(m_swapChain->Present(1, 0));

WaitForPreviousFrame();
}

実際にはどのように機能しますか? ExecuteCommandLists は非同期関数呼び出しであるため、コードの実行が継続され、Present 関数にヒットすることを意味します。

Present call の後はどうなりますか? たとえば、GPU がまだ描画中であり、動作しており、present が呼び出されているとします。Present は同期呼び出しですか? GPU がまだ描画中の場合、バッファを表示できません。あれは正しいですか ?誰かがここで何が起こっているのか説明できますか?

4

1 に答える 1

2

Present は、スワップ チェーン内の次のバッファーからスキャン アウト (表示) を開始するよう GPU に指示する非同期コマンドでもあります。「フリップ」が発生する前に、GPU が以前に発行されたすべての作業 (グラフィックス コマンド キューで) の実行を完了していないことを心配する必要はありません。

于 2015-10-29T22:24:46.253 に答える