Предварительный обзор Microsoft DirectX 12: чего ждать игрокам и разработчикам?


Новая версия DirectX 12, прямо скажем, подзадержалась. DirectX 11 был представлен еще в октябре 2009 года — более четырех лет назад. Для сравнения: путь от DirectX 10 к DirectX 11 занял около трех лет. Сразу отметим: DirectX 12 на Game Developers Conference в Сан-Франциско был всего лишь анонсирован — первые игры на основе DX 12 появятся не раньше конца 2015 года. К этому времени Microsoft может успеть с выпуском Windows 9, какое бы имя эта ОС ни получила в конечном счете.

В общем, на вопрос «Где я могу скачать DirectX 12?» пока нет ответа. Есть только определенные перспективы относительно того, что новая версия API принесет разработчикам и нам, геймерам. А пока что анонс DirectX 12 следует рассматривать как сигнал, что активная работа по развитию DirectX продолжается. Ранее отсутствие видимой активности со стороны Microsoft довело до того, что некоторые уже вообще поставили под сомнение выход новых версий DirectX. Речь идет о прошлогоднем интервью Роя Тейлора, вице-президента AMD по продажам в «канале» (Roy Taylor, Vice President of Global Channel Sales), ресурсу heise.de. Хотя такие заявления следует принимать, как говорится, «со щепоткой соли», особенно в свете собственной инициативы AMD — Mantle (подробнее о ней в нашем обзоре и тестировании AMD Mantle). Как бы то ни было, Microsoft решила напомнить о DirectX и действовать.

В отличие от предыдущих итераций, новый релиз сосредоточен не на графических эффектах и поддержке новых аппаратных функций GPU, а на оптимизации программного стека DirectX под уже существующее железо. AMD убедительно продемонстрировала, что в некоторых отношениях DirectX 11 является бутылочным горлышком, ограничивающим производительность системы. Конкретно: DirectX 11 неэффективен при большом количестве draw calls. Мы исследовали эту проблему в обзоре AMD Mantle, который продемонстрировал весьма впечатляющие результаты в подобных условиях.

Ожидается, что благодаря DirectX 12 эффективность использования CPU увеличится на 50% по сравнению с показателями DX11. По крайней мере такой результат получен с помощью закрытой версии 3DMark 2011, портированной на DX12. Microsoft называет несколько факторов, благодаря которым это стало возможным.

⇡#Многопоточное исполнение инструкций драйвера

Результаты профилирования того же бенчмарка демонстрируют более эффективное распределение нагрузки на CPU между несколькими потоками. На диаграмме видно, что на четыре потока теперь распределяются операции не только самой программы 3DMark, но и драйвера графической карты — речь о компоненте, исполняемом в User Mode.

Кроме того, если присмотреться к диаграмме, то можно заметить, что при использовании DirectX 12 пропадает компонент графического драйвера в Kernel Mode. Речь идет о низкоуровневой подсистеме Direct3D, которая включает менеджер видеопамяти, планировщик GPU, а также miniport driver, который производитель GPU должен предоставить для непосредственного доступа к функциям железа.

DirectX 11

DirectX 12

Таким образом, вся кухня Direct3D теперь полностью переместилась в User Mode. Сам по себе такой шаг негативно отразится на производительности, но, по идее, он должен быть скомпенсирован за счет более эффективной многопоточности, а также отсутствия смены контекста между User Mode и Kernel Mode.

Скачать DirectX 12 бесплатно

ПриложениеOSФорматВерсияРазмерЗагрузка
DirectX 12Windows 10x32 — x64онлайн установщик2.06 Mb
DirectX 12Windows 11x32 — x64онлайн установщик2.03 Mb
DirectX 12Windows 7x32 — x64онлайн установщик2.02 Mb
DirectX 12Windows XPx32 — x64онлайн установщик2.01 Mb

Внимание!! DirectX 12 по умолчанию установлен в Windows 10, если вам надо по какой либо причине обновить данный модуль это возможно только с онлайн установщиком, больше нет пакетов с принудительной установкой, программа проверит и при необходимости скачает и установит последние пакеты DirectX.

⇡#Pipeline State Objects

Кроме того, Microsoft непосредственно поработала над проблемой draw calls, которую столь успешно решает Mantle. Для этого потребовалась основательная переделка графического конвейера Direct3D. Здесь необходим небольшой ликбез относительно того, как выполняется рендеринг в Direct3D. Существует несколько стадий (stages) конвейера, которые на абстрактном уровне олицетворяют этапы подготовки изображения. Важно то, что стадии, вопреки тому, как это может показаться, не выполняются одна за другой в реальном времени. От runtime-компонента DirectX требуется определить состояние конвейера (pipeline state), представляющее собой совокупность состояний каждой из стадий, то есть параметры операций, которые выполняет GPU в процессе рендеринга, и ресурсы — данные, над которыми будут произведены операции (текстуры, вершины и так далее). Только когда все это собрано вместе, делается draw call — вызов, запускающий рендеринг объекта. И вот тогда miniport driver графического процессора, в свою очередь, транслирует pipeline state в набор инструкций для GPU на понятном ему языке (hardware state).

Последний этап вносит свой вклад в общее время отрисовки объекта (напомним, эта и все вышеупомянутые процедуры все еще выполняются на CPU). А если объектов на экране много, то возникает пресловутая проблема draw calls, когда производительность CPU становится бутылочным горлышком. AMD Mantle, будучи низкоуровневым API, уменьшает время подготовки конвейера к отдаче draw call просто за счет отсутствия этапа трансляции pipeline state в hardware state. Хотя кто знает, какие еще оптимизации в Mantle включила AMD. Mantle SDK вместе с подробной документацией пока не распространяется публично.

Direct3D 12 по-прежнему является высокоуровневым API, относительно безразличным к железу, на котором выполняется рендеринг (GPU только сообщает о поддерживаемых им функциях). В нем проблема решается по-другому. Вместо того чтобы передавать драйверу pipeline state целиком в момент draw call, состояния множества отдельных стадий конвейера объединены в несколько более крупных объектов — PSO (Pipeline State Objects), которые формируются незавимисо и отдаются драйверу немедленно. Таким образом, не дожидаясь draw call, драйвер может сразу конвертировать PSO в аппаратные инструкции и чуть ли не отправить последние в регистры GPU (в источнике на MSDN этот момент не совсем понятен). Кроме того, укрупнение объектов, олицетворяющих состояния стадий конвейера, позволяет драйверу быстрее разрешать зависимости между последними. Если в процессе подготовки к draw call какой-либо из PSO поменялся, также требуется пересчитать только соответствующие инструкции, а не hardware state целиком.

Также не совсем ясно, почему именно раздельная репрезентация pipeline state должна привести к драматическому уменьшению времени подготовки к draw call. Так или иначе, на трансляцию pipeline state в hardware state все равно расходуется процессорное время. Возможно, ранняя подготовка отдельных PSO как-то поможет быстрее разрешать зависимости при подготовке hardware state, о чем пишут на MSDN. Может быть, преимущество будет получено за счет исполнения runtime-компонента Direct3D и драйвера GPU на разных потоках.

Краткое описание графического пайплайна

В основе графической библиотеки лежат функции рисования, которые запускают графический конвейер — программно-аппаратное средство визуализации трехмерной графики. Аппаратная составляющая представлена видеоадаптером, программная — драйвером. Графический конвейер можно представить в виде черного ящика, разделенного на этапы и выполняющего необходимые преобразования. Содержимое этого черного ящика может быть различным. Выполняемые преобразования зависят от назначения графической системы, стоимости, требуемого уровня универсальности и многих других факторов. Также, конкретный видеоадаптер — сложный механизм, правила работы которого зачастую известны лишь непосредственно производителю.

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

Преобразование вершин

Каждая вершина имеет определенный набор атрибутов таких, как позиция, цвет, текстурные координаты, вектор нормали или все векторы из касательного пространства и, возможно, некоторые другие. Трансформация вершин — это первая стадия графического конвейера. На этом этапе входными данными являются атрибуты конкретной вершины, над которыми производятся математические преобразования. Эти операции включают трансформацию позиции вершины, генерацию и преобразование текстурных координат, расчет освещения для каждой отдельной вершины, а также любые другие операции, которые необходимо выполнить на уровне вершин. Каждая вершина обрабатывается параллельно с другими вершинами на доступных ядрах графического ускорителя. Основной результат вершинной программы — преобразовать координаты из модельного пространства в специальное пространство отсечения (clip space).

Построение примитивов и растеризация

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

Текстурирование и окрашивание

Над атрибутами примитивов, растеризированных в набор фрагментов, на этой стадии проводится необходимая интерполяция, а также последовательность математических преобразований и операций текстурирования, что определяет конечный цвет каждого фрагмента. Также на этом этапе может определяться новая глубина или даже исключение фрагмента из буфера кадра.

Пофрагментные операции

На этом этапе проводится ряд пофрагментных тестов, таких как тест отсечения (scissor test), тест трафарета (stencil test) и тест глубины (depth test). Эти тесты определяют конечный вид, цвет и глубину фрагмента перед обновлением экранного буфера. Если какой-либо тест проходит с ошибкой, то фрагмент не обновляется. После тестов выполняется операция смешивания, которая комбинирует финальный цвет фрагмента с текущим цветом пиксела, а итоговый результат записывается в экранный буфер. Операция смешивания выполняется на этом этапе, поскольку стадия текстурирования и окрашивания не имеют доступа к экранному буферу.

Более детальное устройство конвейера можно посмотреть в спецификации DirectX 11 (документ по DiretcX 12 затрагивает лишь изменения с предыдущей версией)

⇡#Command lists, bundles

DirectX 12 также представляет новую модель управления нагрузкой GPU с помощью списков команд (command lists). В модели DirectX 11 уже существует этот термин. API предоставляет два типа контекста устройства (device context): immediate context и deferred context. В первом случае команды непосредственно отправляются на драйвер GPU, во втором — записываются списки команд, которые затем могут воспроизводиться в immediate context. Нововведение DX12 состоит в том, что драйвер GPU в модели Direct3D 11 может заранее просчитывать низкоуровневые инструкции на основе различных списков команд.

В дополнение к спискам команд в Direct3D 12 появилась еще одна сущность — bundles. Bundle представляет собой набор команд, которые могут быть исполнены неоднократно в сочетании с различными ресурсами — к примеру, для рендеринга идентичных объектов с разной текстурой. В этом случае от драйвера требуется только один раз подготовить инструкции для GPU.

Что мы можем получить за все это?

После всего этого многословия многие читатели могут задаться вопросом, какие выводы мы можем сделать после официальной презентации DX12 Ultimate. Реальность такова, что на бумаге все эти изменения являются шагом в правильном направлении

для того, что станет ключом для этого поколения:
использование огромных аппаратных ресурсов,
которые будут у Xbox Series X, и будущего Тьюринга и RDNA2; Но как и все в этом мире, без достаточной поддержки со стороны разработчиков, мы никогда не сможем увидеть соответствующие результаты.

0 0 голоса

Рейтинг статьи

⇡#Совместимость, выводы

В отличие от предшествующих версий, DirectX 12 не потеряет совместимости с уже существующими GPU, поддерживающими DirectX 11. NVIDIA уже заявила, что DX12 будет принят процессорами на архитектуре Fermi, Kepler и Maxwell. AMD гарантирует совместимость для GPU на архитектуре GCN, Intel — для графики Iris и Iris Pro в чипах Haswell. DirectX 12 также ожидает портирование на Xbox One.

Впрочем, появилась информация о некоторых дополнительных функциях DirectX 12, которые все-таки потребуют аппаратных модификаций GPU. В целом эту неопределенность, вместе с долгим временем ожидания первых игр с поддержкой DirectX 12, можно рассматривать как знак того, что разработка API пока находится на весьма ранней стадии. В пользу данного предположения говорит и тематика оптимизации использования CPU, которая объединяет DX12 и AMD Mantle, представленный относительно недавно — осенью прошлого года.

Естественно, что DirectX 12 бросает тень на будущее инициативы AMD, которая довольно успешно стартовала и набирает обороты, получая поддержку в популярных игровых движках (Frostbite 3, следующая версия CryEngine). Возможно, именно AMD мотивировала Microsoft тем, что привлекла внимание к недостаткам DirectX 11, но Mantle через полтора-два года уже перестанет быть единственным API, который дает возможность их избежать. При этом совместимость DirectX 12 не ограничивается видеоадаптерами на базе архитектуры GCN. И все же хоронить Mantle рано, ведь у AMD есть много времени, чтобы завоевать лояльность разработчиков. Кроме того, нет никаких гарантий, что DirectX 12 в конце концов будет столь же эффективным, как и Mantle. Как ни крути, DX12 по-прежнему не является низкоуровневым API, в отличие от Mantle, что автоматически дает последнему преимущество в производительности. В этом вопросе рано делать предположения, пока не появились первые результаты публично доступных бенчмарков.

Затенение с переменной скоростью

Затенение с переменной скоростью — это еще одна функция, которая уже была в DX12. Шейдеры сообщают системе, какой должна быть цвет, яркость и контраст каждого пикселя. Однако этот процесс может быть вычислительно дорогостоящим, и именно здесь происходит затенение с переменной скоростью. Оно затеняет важные части игровой сцены с полным разрешением, в то время как менее важные объекты используют меньшую мощность графического процессора для затенения.

Представьте себя за рулем автомобиля в будущем Форза Горизонт или другая гоночная игра, например. Важно, чтобы вы видели машину перед вами во всех деталях, но для того, чтобы дерево или ограждение, проходящие мимо, не требовали такой же обработки.

Вот как NVIDIA описала это:

«Разработанные разработчиками алгоритмы идентифицируют пиксели, которые игрок не может легко увидеть, и пиксели, которые нечасто изменяются или обновляются, и используют VRS для снижения скорости их визуализации (затемнения). Например, черные пиксели в тени не отличаются при уменьшении скорости затенения. Таким образом, благодаря уменьшению скорости затенения множества пикселей на кадр рабочая нагрузка на графический процессор уменьшается, что повышает производительность ».

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

Как пользоваться

Сразу отметим, что речь идет об оффлайн-установщике. Это значит, что для инсталляции DX не потребуется подключение к интернету. Вам необходимо только скачать архив с нашего сайта, а для дальнейших действий подключение к сети не нужно. Вы можете скопировать файл на внешний накопитель и устанавливать программное обеспечение на любое устройство в условиях отсутствия интернета. Инсталляция проводится в несколько простых шагов:

  1. Скачивание и распаковка архива.
  2. Запуск установщика от имени администратора.
  3. Ожидание окончания распаковки файлов.
  4. Перезагрузка компьютера.

Полностью удалить и переустановить с нуля DirectX из операционной системы Windows 10 не получится, поэтому для исправления ошибок вам необходимо ставить данную версию и обновлять ОС до последнего апдейта.

Рейтинг
( 2 оценки, среднее 5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]