Метод ID3D11DeviceContext::Flush (d3d11.h)
Отправляет команды, помещенные в очередь, в буфере команд в графический процессор (GPU).
Синтаксис
void Flush();
Возвращаемое значение
None
Remarks
Большинству приложений не требуется вызывать этот метод. Если приложение вызывает этот метод, если это не требуется, это влечет за собой снижение производительности. Каждый вызов Flush вызывает значительные издержки.
Когда приложение вызывает команды настройки состояния, представления или рисования Microsoft Direct3D, эти команды помещаются в очередь во внутренний буфер команд. Flush отправляет эти команды в GPU для обработки. Как правило, среда выполнения Direct3D автоматически отправляет эти команды в GPU всякий раз, когда среда выполнения определяет, что они должны быть отправлены, например, когда буфер команд заполнен или когда приложение сопоставляет ресурс. Flush отправляет команды вручную.
Рекомендуется использовать функцию Flush , когда ЦП ожидает произвольное время (например, при вызове функции спящего режима ).
Так как функция Flush работает асинхронно, она может возвращать данные до или после завершения gpu выполнения графических команд в очереди. Однако графические команды в конечном итоге всегда выполняются. Для создания запроса на событие можно вызвать метод ID3D11Device::CreateQuery со значением D3D11_QUERY_EVENT ; Затем этот запрос событий можно использовать в вызове метода ID3D11DeviceContext::GetData , чтобы определить, когда GPU завершает обработку графических команд.
Microsoft Direct3D 11 откладывает уничтожение объектов. Поэтому приложение не может полагаться на немедленное уничтожение объектов. Вызывая Flush, вы уничтожаете все объекты, уничтожение которых было отложено. Если приложению требуется синхронное уничтожение объекта, рекомендуется освободить все ссылки, вызвать ID3D11DeviceContext::ClearState, а затем вызвать Flush.
Проблемы с отложенным уничтожением с помощью цепочек буферов представления flip
Direct3D 11 откладывает уничтожение таких объектов, как представления и ресурсы, до тех пор, пока не сможет эффективно их уничтожить. Это отложенное уничтожение может привести к проблемам с цепочками буферов модели представления с отражением. Для цепочек буферов модели представления flip установлен флаг DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL . При создании цепочки буферов модели свертывания презентации можно связать только одну цепочку буферов одновременно с поверхностью HWND, IWindow или композицией. Если приложение пытается уничтожить цепочку буферов модели представления flip и заменить ее другой цепочкой буферов, исходная цепочка буферов не будет уничтожена, когда приложение немедленно освобождает все исходные ссылки на цепочку буферов.Большинство приложений обычно используют метод IDXGISwapChain::ResizeBuffers для большинства сценариев, где они заменяют новые буферы цепочки буферов для старых буферов цепочки буферов. Однако если приложение должно фактически уничтожить старую цепочку буферов и создать новую, приложение должно принудительно уничтожить все объекты, освобожденные приложением. Чтобы принудительно выполнить уничтожение, вызовите ID3D11DeviceContext::ClearState (или иным образом убедитесь, что представления не привязаны к состоянию конвейера), а затем вызовите flush в непосредственном контексте. Перед вызовом IDXGIFactory2::CreateSwapChainForHwnd, IDXGIFactory2::CreateSwapChainForCoreWindow или IDXGIFactory2::CreateSwapChainForComposition необходимо снова создать новую цепочку буферов.
Требования
Целевая платформа | Windows |
Header | d3d11.h |
Библиотека | D3D11.lib |