Direct3D 12 尝鲜(二): Fence
(轉載請注明出處)
正如上節末尾所說, 出現了運行時錯誤:
D3D12 ERROR: ID3D12CommandAllocator::Reset: A command allocator is being reset before previous executions associated with the allocator have completed. [ EXECUTION ERROR #548: COMMAND_ALLOCATOR_SYNC]
就是說要在相關執行完成后才能重置, 在自己的第一印象中, 認為提交呈現(Present)后, 所有的操縱就完成了, 但這樣似乎不是這樣的, 微軟在這里有提到:
Waiting for frame rendering is probably the coarsest way to be certain that the GPU has finished. At a finer grain, you can again use fences
就是說, 等待幀渲染完畢就認為GPU工作完畢了, 這種做法不夠好, 最好使用Fence:
好了, 籬笆來了, 路障來了, 微軟你不再來個釘刺帶?╮( ̄▽ ̄)╭
Fence對應的接口就是ID3D12Fence了,可以利用ID3D12Device::CreateFence創建這個接口, 具體代碼就不累述了, 很簡單.
這個Fence是以幀為單位的, 可以等待所有針對這一幀的命令.利用ID3D12Fence::SetEventOnCompletion和ID3D12CommandQueue::Signal進行信號操作, 完了之后等待即可, 以幀為單位。
不過還有個ID3D12Fence::Signal, 看來有可能ID3D12CommandQueue::Signal會調用這個方法, 否則這個Fence沒有能與命令綁定的方法.
所以大致渲染流程就是:
結合上次, 這次就很簡單了. 還有就是我試了下將3放在5后面, 也(貌似?)沒問題, 不過根據微軟的表述, 還是放在Signal前面.
所附代碼下載:
點擊這里
總結
以上是生活随笔為你收集整理的Direct3D 12 尝鲜(二): Fence的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正交矩阵正交向量
- 下一篇: css的nth选择器,CSS3 :nth