1

コマンドリストを理解しようとしています。コマンド リストには、レンダリング用のコマンドが記録されますが、リソースのバインドも記録されます。たとえば、頂点データを含むバッファーとしましょう。

m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);

これは、頂点バッファーのバインドを記録します。この時点でバッファはどうなりますか? 記録後にこの頂点バッファの内容を変更するとどうなりますか? execute command list を呼び出した後にこの頂点バッファーの内容を変更し、gpu がまだ終了していない場合はどうなりますか?

ExecuteCommandList は非同期関数呼び出しだと思いますが、そうですか? すべてのバインド (gpu へのデータ転送) を一度に実行しますか、それともすべてのバインドでもコマンドを 1 つずつ実行しますか? コマンド リストはドライバーによって実行されますか、それともすべて gpu に送信されますか?

まあ、良い例が不足しているので、まだたくさんの質問があります. 明確にするためにいくつか答えていただければ幸いです。

4

1 に答える 1

1

With DirectX 12, synchronization is entirely the application's responsibility. You have to insert and check fences to make sure the GPU is done with your buffer before you modify it. For dynamic buffers, you need to do your own double/triple/n buffering.

When you call ExecuteCommandList is just queues it up to the GPU. It will take some time before the GPU actually picks it up and then completes it.

Be sure to check the DirectX Graphics Samples GitHub project. The samples there and the Mini Engine demo are good places to find example usage.

This design makes DirectX 12 extremely powerful as it gives the application direct control over lots of things that were 'magic' in the Direct3D 11 Runtime. That said, the resulting API is much harder to actually use unless you are already a good enough graphics engineer that you could write the Direct3D 11 Runtime. Using Direct3D 11 API is still a fine choice for a project too.

于 2015-10-29T01:56:51.533 に答える