Direct3D 12 尝鲜(二): Fence
来源:互联网 发布:淘宝10元包邮活动 编辑:程序博客网 时间:2024/06/05 21:10
(转载请注明出处)
正如上节末尾所说, 出现了运行时错误:
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没有能与命令绑定的方法.
所以大致渲染流程就是:
- Fence -> SetEventOnCompletion
- 执行命令
- 提交呈现
- Queue -> Signal
- WaitForXXXXXXXObject
结合上次, 这次就很简单了. 还有就是我试了下将3放在5后面, 也(貌似?)没问题, 不过根据微软的表述, 还是放在Signal前面.
所附代码下载:
点击这里
- Direct3D 12 尝鲜(二): Fence
- Direct3D 12 尝鲜: 基本呈现
- Direct3D 12 尝鲜(三): Pipeline State Object
- Direct3D 12 尝鲜(五): SDK 更新
- Direct3D 12 尝鲜(四): 旋转的彩色立方体
- 学习Direct3D(二)
- Direct3D学习笔记二
- Direct3D 10系统(二)
- Direct3D 10系统(二)
- Direct3D 12 Preview
- Direct3D 12 Programming Guide
- Direct3D
- fence
- Fence
- Fence
- Fence
- Direct3D学习(二):模型显示
- Direct3D 10系统(二)(转载)
- Win7下VC6打开文件报错导致其崩溃的解决办法
- Python学习之路13——字符串2
- bzoj 1251/tyvj p2195 序列终结者
- NSSearchPathForDirectoriesInDomains用法
- 黑马程序员JAVA 070---080 小结
- Direct3D 12 尝鲜(二): Fence
- Android血泪史之Unable to instantiate activity ComponentInfo
- 上传控件 WebUploader
- Android SDK Manager无法更新
- angularjs学习之五(angularjs中一般函数参数的传递)
- change user
- Linux改变目录及其文件的用户和群组
- Linux下Xshell和Xmanager实现远程服务器的图形界面
- Linux多线程与同步