Новые возможности DirectX 11 - Многопоточный рендеринг
Хотя
многопоточный рендеринг сложно назвать новой частью графического
конвейера, это невероятно важная особенность DirectX 11. Она становится
ещё более важной, если вы посмотрите на её потенциал с расчетом на
портирование этих усовершенствований на аппаратные средства класса
DirectX 10 при помощи обновления драйверов.
Сегодня на рынке
преобладают двухядерные CPU, хотя четырехядерные модели становятся все
более доступными для геймеров и энтузиастов, поэтому в ближайшем
будущем четырехядерные процессоры заменят своих двуядерных собратьев,
став в области процессоров стандартом де-факто. Учитывая этот факт,
возникает резонный вопрос, почему DirectX до сих пор не поддерживает
многопоточный рендеринг. Справедливости ради стоит отметить, что и AMD,
и Nvidia уже работали над многопоточными драйверами, однако успех этих
начинаний был ограничен тем, что API в конечном счете сводил все к
одному потоку.
Некоторые разработчики придумывали способы использования дополнительных
ядер, в то время как другие изо всех сил пытались извлечь больше
производительности и часто оставляли простаивать эти дополнительные
ядра. Сегодня таких проблем становится всё меньше, поскольку
разработчики стали думать по поводу распараллеливания потоков, но всё
ещё есть такие сценарии, когда приложение сильно ограничивается
возможностями CPU.
К счастью, с приходом DirectX 11 ситуация
должна коренным образом измениться, и Microsoft сделает возможным
получение выгоды от использования этих функций на аппаратном
обеспечении DirectX 10. Команды разработчиков соответствующих драйверов
в AMD и Nvidia должны будут проделать определенный комплекс работ,
чтобы осуществить поддержку этих функций в своих драйверах, но как
только они это сделают для DX11, им не составит большого труда
перенести эту поддержку и в DX10.
Microsoft удалось достичь
этого путем разбиения устройства Direct3D на три отдельных интерфейса:
Device, Immediate Context (прямой контекст) и Deferred Context
(отложенный контекст). Каждый из них назначается на поток, поэтому
благодаря интерфейсам Device и Deferred Context на задачи, стоящие в
очереди Immediate Context или потока обработки, может быть назначено
больше одного потока.
Переключение между потоками легко
контролировать, так что разработчик должен будет сам решать, как и в
каком порядке операции будут помещаться в очередь для интерфейса
Immediate Context. Каждый интерфейс Device может загружать потоковые
ресурсы как и когда угодно в то время, как интерфейс Deferred Context
служит в качестве работающего с потоками контекста устройств для
будущих операций рендеринга - он организует очередь из запросов
прорисовки (или списков команд Display List) прежде, чем передать их
интерфейсу Immediate Context, когда он будет готов.
Для
графических карт поколения DirectX 10 интерфейс Deferred Context должен
реализоваться на программном, а не аппаратном, уровне, поскольку в
новом аппаратном обеспечении будут сделаны соответствующие оптимизации
для многопоточного рендеринга. Из-за этого интерфейсы Deferred Context
не смогут самостоятельно распределяться по потокам на аппаратном
обеспечении DX10 и это прийдётся сделать на уровне API.