ID3D11DeviceContext::Flush 方法 (d3d11.h)

将命令缓冲区中的排队命令发送到图形处理单元 (GPU) 。

语法

void Flush();

返回值

备注

大多数应用程序不需要调用此方法。 如果应用程序在不需要时调用此方法,则会造成性能损失。 每次调用 Flush 都会产生大量开销。

当应用程序调用 Microsoft Direct3D 状态设置、present 或 draw 命令时,这些命令将排队进入内部命令缓冲区。 刷新 将这些命令发送到 GPU 进行处理。 通常,每当运行时确定需要发送这些命令时,Direct3D 运行时会自动将这些命令发送到 GPU,例如命令缓冲区已满或应用程序映射资源时。 Flush 手动发送命令。

我们建议在 CPU 等待任意时间量 ((例如调用 Sleep 函数) 时)使用 Flush

由于 Flush 以异步方式运行,因此它可以在 GPU 完成执行排队的图形命令之前或之后返回 。 但是,图形命令最终始终完成。 可以使用 D3D11_QUERY_EVENT 值调用 ID3D11Device::CreateQuery 方法来创建事件查询;然后,可以在调用 ID3D11DeviceContext::GetData 方法时使用该事件查询来确定 GPU 何时完成图形命令的处理。

Microsoft Direct3D 11 延迟对象的销毁。 因此,应用程序不能依赖于立即销毁的对象。 通过调用 Flush,可以销毁延迟销毁的任何对象。 如果应用程序需要同步销毁对象,建议应用程序释放其所有引用,调用 ID3D11DeviceContext::ClearState,然后调用 Flush

翻转演示文稿交换链的延迟销毁问题

Direct3D 11 会延迟对象(如视图和资源)的销毁,直到它可以有效地销毁它们。 这种延迟的销毁可能会导致翻转呈现模型交换链出现问题。 翻转演示文稿模型交换链具有 DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 标志集。 创建翻转演示文稿模型交换链时,一次只能将一个交换链与 HWNDIWindow 或合成图面相关联。 如果应用程序尝试销毁翻转表示模型交换链并将其替换为另一个交换链,则当应用程序立即释放原始交换链的所有引用时,原始交换链不会销毁。

大多数应用程序通常使用 IDXGISwapChain::ResizeBuffers 方法来替换旧交换链缓冲区的新交换链缓冲区。 但是,如果应用程序必须实际销毁旧的交换链并创建新的交换链,则应用程序必须强制销毁应用程序释放的所有对象。 若要强制销毁,请调用 ID3D11DeviceContext::ClearState (或确保没有视图绑定到管道状态) ,然后在直接上下文中调用 Flush 。 在再次调用 IDXGIFactory2::CreateSwapChainForHwndIDXGIFactory2::CreateSwapChainForCoreWindowIDXGIFactory2::CreateSwapChainForComposition 之前,必须强制销毁才能创建新的交换链。

要求

   
目标平台 Windows
标头 d3d11.h
Library D3D11.lib

另请参阅

ID3D11DeviceContext