Поделиться через


Общие сведения о многопоточности в Direct3D 11

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

В прошлом это часто было сделано путем создания одного основного потока для отрисовки и одного или нескольких потоков для выполнения подготовки, таких как создание объектов, загрузка, обработка и т. д. Однако при встроенной синхронизации в 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 с несколькими потоками см. в аспектах многопоточности.

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