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

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

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

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

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

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

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

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

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

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

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

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

Pipeline State Objects

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

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

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

Direct3D 12 по-прежнему является высокоуровневым API, относительно безразличным к железу, на котором выполняется рендеринг (GPU только сообщает о поддерживаемых им функциях). В нем проблема решается по-другому. Вместо того чтобы передавать драйверу pipeline state целиком в момент draw call, состояния множества отдельных стадий конвейера объединены в несколько более крупных объектов которые формируются незавимисо и отдаются драйверу немедленно. Таким образом, не дожидаясь 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 на разных потоках.

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.

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

В отличие от предшествующих версий, 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, представленный относительно недавно — осенью прошлого года.

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

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

(*) Часть новых графических функций DirectX 12 не будет доступна на GPU класса DX11

Когда Microsoft представила во время конференции разработчиков игр GDC 2014 новый графический API DirectX 12, общественность узнала, что все видеокарты NVIDIA класса DirectX 11, все ускорители AMD на базе архитектуры GCN, а также графика Iris и Iris Pro в процессорах Intel Haswell будут поддерживать новый API. Однако, как оказалась, это утверждение справедливо лишь отчасти.

Старший вице-президент по контенту и технологиям в NVIDIA Тони Тамаси (Tony Tamasi) несколько прояснил ситуацию в беседе с журналистами ресурса TechReport. По его словам, DirectX 12 в самом деле принесёт поддержку более низкоуровневого доступа к оборудованию для современных графических ускорителей (впрочем, разработчики вольны не использовать возможности более прямого доступа к GPU, да и обратная совместимость с DirectX 11 останется).

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

Таким образом, DirectX 12 до известной степени повторит путь предыдущих версий стандарта: полноценная поддержка следующего API потребует появления нового поколения графических ускорителей. В результате уже сейчас можно с уверенностью говорить: Xbox One не будет обладать полноценной поддержкой DirectX 12.

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

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

Пока Microsoft упомянула лишь две возможности DirectX 12, для которых может понадобиться оборудование следующего поколения: новые режимы наложения (blending modes) и консервативная растеризация (conservative rasterization), которая должна улучшить процесс отсечения объектов (object culling) и определения столкновений. Оба новшества не кажутся принципиальными, но, если верить намёкам господина Тамаси, Microsoft раскрыла пока далеко не все карты — возможно, перед нами лишь вершина айсберга. Что ж, подождём следующего анонса программного гиганта.


Добавить комментарий

Ваш e-mail не будет опубликован.

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.