即时和延迟呈现

Direct3D 11 支持两种类型的呈现:即时呈现和延迟呈现。 两者都是使用 ID3D11DeviceContext 接口实现的。

即时呈现

即时呈现是指从设备调用呈现 API 或命令,它将缓冲区中的命令排入队列,以便在 GPU 上执行。 使用即时上下文呈现、设置管道状态和播放命令列表。

使用 D3D11CreateDeviceD3D11CreateDeviceAndSwapChain 创建即时上下文。

延迟呈现

延迟呈现将图形命令记录在命令缓冲区中,以便可以在其他某个时间播放这些命令。 使用延迟上下文记录命令 (呈现,以及) 状态设置到命令列表。 延迟呈现是 Direct3D 11 中的一个新概念;延迟呈现旨在支持在一个线程上呈现,同时记录用于在附加线程上呈现的命令。 这种并行的多线程策略允许将复杂场景分解为并发任务。 有关呈现复杂场景的详细信息,请参阅 多通道渲染

使用 ID3D11Device::CreateDeferredContext 创建延迟上下文。

Direct3D 在命令缓冲区中将命令排队时会产生呈现开销。 相比之下, 命令列表 在播放过程中的执行效率要高得多。 若要使用命令列表,请记录具有延迟上下文的呈现命令,并使用即时上下文播放它们。

只能以单线程方式生成单个命令列表。 但是,可以同时创建和使用多个延迟的上下文,每个上下文都在单独的线程中。 然后,可以使用这些多个延迟的上下文同时创建多个命令列表。

不能在即时上下文中同时播放两个或更多个命令列表。

若要确定设备上下文是即时上下文还是延迟上下文,请调用 ID3D11DeviceContext::GetType

ID3D11DeviceContext::Map 方法仅在动态资源的延迟上下文中受支持, (D3D11_USAGE_DYNAMIC) D3D11_MAP_WRITE_DISCARD命令列表中的第一次调用。 如果给定类型的资源可用,则后续调用支持D3D11_MAP_WRITE_NO_OVERWRITE

延迟上下文中的查询仅限于数据生成和谓词绘制。 不能在延迟的上下文上调用 ID3D11DeviceContext::GetData 来获取有关查询的数据;只能在即时上下文中调用 GetData 来获取有关查询的数据。 可以通过调用 D3D11DeviceContext::SetPredication 以在 GPU 上使用查询结果, (一种类型的查询) 设置呈现谓词。 可以通过调用 ID3D11DeviceContext::BeginID3D11DeviceContext::End 来生成查询数据。 但是,在直接上下文上调用 ID3D11DeviceContext::ExecuteCommandList 以提交延迟的上下文命令列表之前,查询数据将不可用。 然后,查询数据由 GPU 处理。

多线程处理