尝试了解命令列表。 好吧,命令列表记录了我的渲染命令,还记录了绑定资源,让我们说一个带顶点数据的缓冲区。
m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
这记录了顶点缓冲区的绑定。这个时候缓冲区会发生什么?如果在录制后更改此顶点缓冲区的内容会发生什么?如果我在调用执行命令列表并且gpu未完成之后更改了此顶点缓冲区的内容会发生什么?
我猜ExecuteCommandList是一个异步函数调用,对不对?它是一次执行所有绑定(数据传输到gpu),还是逐个执行命令甚至所有绑定?命令列表是由驱动程序执行还是全部发送到gpu?
好吧,因为缺乏好的例子,我还有很多问题。我很高兴,如果你能回答其中的一些问题,那就明白了。
答案 0 :(得分:1)
使用DirectX 12,同步完全是应用程序的责任。在修改之前,您必须插入并检查围栏以确保GPU已完成缓冲区。对于动态缓冲区,您需要进行自己的double / triple / n缓冲。
当您致电t
时,只需将其排队到GPU。 GPU真正需要一段时间然后才能完成它。
务必检查DirectX Graphics Samples GitHub项目。那里的样本和Mini Engine演示是查找示例用法的好地方。
这种设计使得DirectX 12非常强大,因为它使应用程序可以直接控制许多“神奇”的东西。在Direct3D 11运行时。也就是说,除非你已经是一个足够好的图形工程师,你可以编写Direct3D 11 Runtime,否则生成的API 很多实际使用。使用Direct3D 11 API仍然是项目的不错选择。