即时和延迟呈现

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 会处理查询数据。

多线程处理