Direct3D10 и Direct3D11 - SIISII/DirectX Wiki

Original URL: https://github.com/SIISII/DirectX/wiki/Direct3D10-и-Direct3D11

DirectX 10, составной частью которого является Direct3D 10, появился в Windows Vista; DirectX 11 появился в Windows 7, но его поддержка была добавлена и в Windows Vista соответствующим обновлением. Обе этих версии «идеологически» близки, и работа с ними в первом приближении ведётся одинаково, поэтому они рассматриваются вместе.

Рендеринг, то есть формирование двухмерного изображения трёхмерной сцены, осуществляется так называемым [устройством Direct3D](/SIISII/DirectX/wiki/Устройство Direct3D10 и Direct3D11), которое фактически является программным интерфейсом с драйвером и через него — с графическим процессором и другим оборудованием, физически выполняющем рендеринг.

В процессе рендеринга исходная геометрия, состоящая из примитивов (точек, отрезков и треугольников), проходит несколько стадий преобразования на [графическом конвейере](/SIISII/DirectX/wiki/Графический конвейер Direct3D10 и Direct3D11); результатом являются значения цветов пикселей, записанные в так называемую цель рендеринга, которой обычно является один из буферов [цепочки переключения буферов](/SIISII/DirectX/wiki/Цепочка переключения буферов).

Все исходные данные и результаты рендеринга, а при необходимости и определённые промежуточные результаты размещаются в памяти и называются [ресурсами](/SIISII/DirectX/wiki/Ресурсы в Direct3D10 и Direct3D11).

Ряд функций, относящихся к графике, но не связанных напрямую с рендерингом (например, перечисление адаптеров или управление цепочкой переключения буферов), в любой версии DirectX, начиная с 10-й, выполняется с помощью интерфейсов [[DXGI]].

Для облегчения отладки в Direct3D имеются специальные [средства](/SIISII/DirectX/wiki/Отладочные средства в Direct3D10 и Direct3D11).

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

С точки зрения возможностей использования Direct3D10 является, по сути, однопоточным. Хотя вызовы методов устройства Direct3D10 технически могут осуществляться из нескольких потоков одновременно, внутри используется глобальная блокировка, делающая выполнение запрошенной функции однопоточной. Соответственно, многопоточный рендеринг, используя Direct3D10, лишён смысла.

Direct3D11 является значительно более многопоточным. Вызовы методов устройства Direct3D11 блокируют друг друга только при реальной необходимости. Более того, благодаря разделению функций создания ресурсов и собственно рендеринга (последний в Direct3D11 выполняется не самим устройством, а [контекстом](/SIISII/DirectX/wiki/Контексты устройства Direct3D11) устройства) появилась возможность совмещать ряд подготовительных операций, выполняя их в разных потоках.

Создание ресурсов, выполняемое в Direct3D11, как и в Direct3D10, через устройство Direct3D, является потокобезопасным, то есть может выполняться одновременно несколькими потоками без каких-либо специальных мер безопасности.

Рендеринг в Direct3D11 выполняется через контексты устройства. Только один из них, называемый немедленным, фактически выполняет рендеринг. Другие контексты, создаваемые и уничтожаемые по мере необходимости, называются отложенными и выполняют «отложенный рендеринг», то есть подготовительную работу к рендерингу, приводящую к созданию списка команд, который затем может быть воспроизведён немедленным контекстом. Каждый из контекстов не является потокобезопасным: хотя любой его метод может быть вызван любым потоком, только один метод может быть вызван в любое данное время. По сути, для выполнения многопоточного рендеринга надо иметь по контексту на поток.

С DXGI может работать только тот поток, который работает с немедленным контекстом. Из других потоков безопасно вызывать лишь методы DXGI, унаследованные от интерфейса IUnknown.

Однако фактическое выполнение рендеринга (для этого используется так называемый немедленный контекст) всё равно выполняется в одном потоке.