Вводные сведения о многопоточности в Direct3D 11

Многопоточность предназначена для повышения производительности за счет одновременного использования одного или нескольких потоков.

В прошлом это часто выполнялось путем создания одного потока main для отрисовки и одного или нескольких потоков для выполнения подготовительных работ, таких как создание, загрузка, обработка и т. д. Однако при встроенной синхронизации в Direct3D 11 целью многопоточности является использование каждого цикла ЦП и GPU, не заставляя процессор ждать другого процессора (особенно не заставляя GPU ждать, так как это напрямую влияет на частоту кадров). Таким образом, вы сможете создать наибольший объем работы, сохраняя при этом оптимальную частоту кадров. Концепция одного кадра для отрисовки больше не является необходимой, так как API реализует синхронизацию.

Для многопоточности требуется определенная форма синхронизации. Например, если несколько потоков, выполняемых в приложении, должны получать доступ к одному контексту устройства (ID3D11DeviceContext), это приложение должно использовать некоторый механизм синхронизации, например критические разделы, для синхронизации доступа к данному контексту устройства. Это связано с тем, что обработка команд отрисовки (обычно выполняется на GPU) и создание команд отрисовки (обычно выполняется в ЦП с помощью создания объектов, загрузки данных, изменения состояния, обработки данных) часто используют одни и те же ресурсы (текстуры, шейдеры, состояние конвейера и т. д.). Организация работы в нескольких потоках требует синхронизации, чтобы предотвратить изменение или чтение данных, которые изменяются другим потоком.

Хотя использование контекста устройства (ID3D11DeviceContext) не является потокобезопасным, использование устройства Direct3D 11 (ID3D11Device) является потокобезопасным. Так как каждый ID3D11DeviceContext является одним потоком, только один поток может вызывать ID3D11DeviceContext одновременно. Если нескольким потокам требуется доступ к одному ID3D11DeviceContext, они должны использовать некоторый механизм синхронизации, например критические разделы, для синхронизации доступа к id3D11DeviceContext. Однако для доступа к одному ID3D11Device не требуется использовать критические разделы или примитивы синхронизации. Таким образом, если приложение использует ID3D11Device для создания объектов ресурсов, это приложение не требуется использовать синхронизацию для одновременного создания нескольких объектов ресурсов.

Поддержка многопоточности разделяет API на две отдельные функциональные области:

Производительность многопоточности зависит от поддержки драйвера. Практическое руководство. Проверка поддержки драйверов содержит дополнительные сведения о запросе драйвера и о том, что означают результаты.

Direct3D 11 был разработан с нуля для поддержки многопоточности. Direct3D 10 реализует ограниченную поддержку многопоточности, используя потокобезопасный уровень. На этой странице перечислены различия в поведении между двумя версиями DirectX: Потоковые различия между версиями Direct3D.

Многопоточность и DXGI

Только один поток за раз должен использовать непосредственный контекст. Однако приложение также должно использовать этот же поток для операций инфраструктуры графики Microsoft DirectX (DXGI), особенно когда приложение вызывает метод IDXGISwapChain::P resent .

Примечание

Недопустимо использовать непосредственный контекст одновременно с большинством функций интерфейса DXGI. Для пакетов SDK DirectX за март 2009 г. и более поздних версий единственными безопасными функциями DXGI являются AddRef, Release и QueryInterface.

 

Дополнительные сведения об использовании DXGI с несколькими потоками см. в разделе Рекомендации по многопотоковой работе.

Многопоточность