Игры будущего по версии Microsoft. Обзор DirectX 12

В марте текущего года в рамках ежегодной конференции разработчиков игр GDC 2014 (Game Developer Conference) компания Microsoft анонсировала API нового поколения — DirectX 12. С момента запуска предыдущей версии API прошло почти 5 лет (напомним, DirectX 11 увидел свет аж в июле 2009 года), и, даже несмотря на то, что программный интерфейс Microsoft получил несколько обновлений, его позиции заметно пошатнулись. Влияние API OpenGL, напротив, стало более существенным. А компания AMD даже запустила свой собственный низкоуровневый программный интерфейс Mantle. «Тишина» из стана Microsoft дала почву для не самых лучших прогнозов относительно дальнейшего развития DirectX, однако весенний анонс двенадцатой версии API расставил все точки над «ё». Microsoft снова в игре.

Одной из первых компьютерных игр с поддержкой DirectX 12 стала демо-версия Forza Motorsport 5
Одной из первых компьютерных игр с поддержкой DirectX 12 стала демо-версия Forza Motorsport 5

О нелегкой судьбе Microsoft

Последние несколько лет стали не самыми удачными для Microsoft. Пользователи с прохладой встретили новую операционную систему Windows 8, не с лучшей стороны проявила себя и мобильная платформа Surface. Вдобавок ко всему, компания подпортила себе репутацию всем известным лейблом Games for Windows и сервисом LIVE. DirectX 11 едва ли не пошел по стопам других неудачных проектов Microsoft последних лет: разработчики не спешили переводить игры «на рельсы» нового API, и большинство развлекательных программ поддерживали его только опционально. А та же Valve и вовсе в открытую склонялась к OpenGL. В общем, американской компании пришлось нелегко на всех фронтах — и не только в игровой сфере.

Платформа Microsoft Surface не снискала особого успеха
Платформа Microsoft Surface не снискала особого успеха

Источник изображения

Как уже говорилось выше, с момента выпуска DirectX 11 до анонса двенадцатой итерации API прошло почти 5 лет. Microsoft еще никогда так не затягивала с выпуском нового поколения программного интерфейса. Ходит множество слухов относительно такой политики, но, скорее всего, основная причина этого кроется в долгом жизненном цикле игровой консоли Xbox 360. В компании были попросту не заинтересованы в развитии нового API для уходящей в прошлое приставки. DirectX 12 разрабатывается уже с прицелом на ее преемницу — Xbox One, которая была выпущена лишь в ноябре прошлого года, а в России, кстати, официально не представлена до сих пор. Но не консолью единой: DirectX 12 будет поддерживаться целой гаммой устройств, начиная от смартфонов и планшетов и заканчивая десктопами.

Официальные продажи Xbox One в России стартуют 26 сентября
Официальные продажи Xbox One в России стартуют 26 сентября

Источник изображения

Что же нового принесет нам двенадцатая версия «директирисы»? Главным отличием нового API от всех его предшественников стало снижение уровня абстрагирования оборудования. DirectX 12 предоставит иную модель программирования. Как говорят в Microsoft, «приближенную к железу» («closer to the metal»). Используя такую модель, разработчики получат более широкий доступ к различным возможностям графического чипа. Кроме этого, DirectX 12 теперь поддерживает объекты состояния конвейера (PSO, pipeline-state object) и таблицы дескрипторов. Наконец, API получил новые возможности для конвейера рендеринга, которые значительно увеличивают производительность в таких алгоритмах, как определение коллизий, расчет прозрачности или геометрическая отбраковка. А теперь давайте подробнее остановимся на каждом изменении.

CD Projekt: DirectX 12 не повысит производительность Xbox One
CD Projekt: DirectX 12 не повысит производительность Xbox One

Объекты состояния конвейера

Одним из недостатков Direct3D 11 была так называемая проблема вызовов отрисовки (draw call). С ней благополучно справились программисты AMD при разработке API Mantle. Похожим образом эта проблема была решена и в Direct3D 12. Для этого потребовалась значительная переработка графического конвейера. Однако для начала нужно объяснить, как же происходит рендеринг картинки в Direct3D 11 и в чем конкретно заключается недостаток вызовов отрисовки.

Схема рендеринга в Direct3D 11
Схема рендеринга в Direct3D 11

Источник изображения

Для описания любого объекта на экране Direct3D 11 использует состояния конвейера: это и состояние входного ассемблера (input assembler state), и состояние пиксельного шейдера (pixel shader state), а также состояния растеризатора (rasterizer state) и выходного смесителя (output merger state). Все они могут изменяться независимо друг от друга. Такая архитектура представляет собой удобную и относительно высокоуровневую реализацию графического конвейера. Однако в силу того, что между этими состояниями существуют различного рода зависимости, такое представление графического конвейера не совсем подходит для современного «железа». Объясним почему. Важно понимать, что стадии конвейера выполняются не последовательно, а в какой-то степени параллельно. К примеру, многие GPU обрабатывают состояния пиксельных шейдеров и выходного смесителя в одном аппаратном блоке. Всякий раз от рантайм-компонента DirectX требуется определить состояние конвейера (совокупность состояний каждой стадии) и ресурсов (вершин, текстур и так далее), над которыми будут производиться операции. Как только все данные известны, производится вызов отрисовки. Иными словами, draw call вызывает рендеринг объекта. Все эти операции выполняются силами центрального процессора. И когда объектов на экране становится много, скорости CPU не хватает для их обработки, и максимальное количество вызовов отрисовки на кадр уменьшается. В этом и заключается смысл проблемы draw calls.

Схема рендеринга в Direct3D 12
Схема рендеринга в Direct3D 12

Источник изображения

В Direct3D 12 большая часть состояний объединена в неизменяемый объект состояния конвейера (PSO). Это позволяет драйверу, не дожидаясь вызова отрисовки, конвертировать этот объект в аппаратные инструкции, необходимые для последующей работы GPU. Тут же стоит отметить, что система может динамически менять используемый объект PSO. После этого в аппаратные регистры копируется лишь небольшой объем рассчитанных состояний, тогда как в Direct3D 11 аппаратное состояние определялось «на ходу». В итоге такой подход ликвидирует то «бутылочное горлышко», коим являлся центральный процессор, и обеспечивает большее количество вызовов отрисовки на каждый кадр.

Списки команд и пакеты

В Direct3D 12 также появилась новая модель управления нагрузкой GPU, включающая в себя списки команд и пакеты. В Direct3D 11 все задания GPU отправлялись через непосредственный контекст (immediate context), который представляет собой единый поток команд. А для того чтобы обеспечить многопоточность, в играх также используются отложенные контексты, которые тем не менее не совсем подходят под архитектуру нынешних процессоров.

Модель отправки заданий в Direct3D 12 базируется на списках команд, который содержат все данные, необходимые для работы GPU. В каждом списке команд указывается, какой объект PSO нужно использовать, какие текстуры и буферные данные необходимы. Также в списке находятся аргументы для всех вызовов отрисовки. Список команд сам по себе автономный и не имеет состояния, поэтому драйвер может заранее рассчитать все необходимые для GPU команды. В конце все списки сериализуются и отправляются в GPU посредством очереди команд.

Схематичное представление очереди команд
Схематичное представление очереди команд

Источник изображения

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

Таблицы и наборы дескрипторов

Привязка ресурсов в Direct3D 11 довольно удобна и при этом обладает довольно высоким уровнем абстрагирования. Тем не менее принцип ее работы также не позволяет «на полную катушку» использовать возможности нынешнего «железа». При использовании Direct3D 11 в играх создаются специальные объекты представления, а затем эти представления привязываются к определенным «слотам» различных этапов шейдера в конвейере. Шейдеры, в свою очередь, считывают информацию из этих слотов, которые фиксируются в момент отрисовки. Основной недостаток такой модели заключается в том, что, когда в игре требуется отрисовка с использованием иных ресурсов, необходимо выполнить повторную привязку и только после этого делать draw call. Как вы понимаете, этот процесс очень трудоемкий. Поэтому в Direct3D 12 он был переработан с учетом возможностей новых процессоров и видеокарт.

Схематичное изображение дескриптора
Схематичное изображение дескриптора

Источник изображения

В двенадцатой версии API на смену явной привязке к слотам пришла модель, использующая набор дескрипторов (descriptor heap), в которые игра записывает свои представления ресурсов. Такой подход позволяет графическому процессору напрямую записывать аппаратное описание ресурса в память. Для определения того, какие именно ресурсы будет использовать конвейер для конкретного вызова отрисовки, в играх указываются одна или несколько таблиц дескрипторов, которые представляют собой подмассивы полного набора дескрипторов. И поскольку набор дескрипторов состоит из специфичных, понятных «железу» данных, то смена таблиц осуществляется намного быстрее, нежели процесс повторной привязки в Direct3D 11.

Схематичное изображение набора дескрипторов
Схематичное изображение набора дескрипторов

Источник изображения

В дополнение к таблицам и наборам дескрипторов Direct3D 12 поддерживает динамическую индексацию в шейдерах, что обеспечивает высокую гибкость и позволяет использовать новые технологии рендеринга. Например, современные движки рендеринга, использующие отложенный подход (deferred rendering engines), обычно кодируют идентификатор объекта или материал в предварительный g-буфер. В Direct3D 11 при использовании большого количества материалов значительно замедлялась заключительная стадия рендеринга. Динамическая индексация решает именно эту проблему. При использовании Direct3D 12 сцена с одной тысячей материалов финализируется так же быстро, как и сцена с десятью материалами.

Практическая часть

Как говорят сами разработчики: «для нас, пользователей, основным преимуществом DirectX 12 станет увеличенная эффективность API, а следовательно, и скорость работы.» Свои слова программисты Microsoft подтвердили на деле. Во время конференции GDC производительность двенадцатой версии DirectX была оценена с помощью известного бенчмарка 3DMark. Пакет работает сейчас только с DirectX 11, но для тестирования он был специально портирован на DirectX 12. Одиннадцатая итерация API активно использует многопоточность, однако в силу особенностей работы, связанных с драйверами и рантаймом, ядра и потоки графического процессора время от времени простаивают. Это наглядно отображено на графиках, приведенных чуть ниже. При использовании DirectX 12 ситуация меняется в лучшую сторону. Примерно на 50% улучшается эффективность использования CPU, а также обеспечивается более эффективное распараллеливание работы между потоками.

Результаты тестирования в режимах DirectX 11 (сверху) и DirectX 12 (снизу). Новый API эффективнее использует ресурсы CPU. В качестве тестового стенда использовалась система GIGABYTE BRIX Pro (Intel Core i7-4770R + Iris Pro Graphics 5200)
Результаты тестирования в режимах DirectX 11 (сверху) и DirectX 12 (снизу). Новый API эффективнее использует ресурсы CPU. В качестве тестового стенда использовалась система GIGABYTE BRIX Pro (Intel Core i7-4770R + Iris Pro Graphics 5200)

Источник изображения

Режим Direct3D 11
Режим Direct3D 11

Источник изображения

Режим Direct3D 12
Режим Direct3D 12

Источник изображения

Во время презентации DirectX 12 разработчики Microsoft упомянули и об автомобильном симуляторе Forza Motorsport 5, который является эксклюзивом для платформы Xbox One. Они отметили, что игра использует все возможности приставки «на полную катушку», а все благодаря низкоуровневому API, доступному для Xbox One. И если раньше такую эффективность можно было достичь только на консолях, то теперь она доступна также на смартфонах и настольных компьютерах — конечно же, благодаря DirectX 12. Это было продемонстрировано на примере вышеупомянутой игры Forza Motorsport 5, которая была портирована на PC в качестве технической демо-версии. К слову, разработчики автосимулятора, компания Turn 10 Studios, уже пытались портировать игру на PC с помощью DirectX 11, однако так и не смогли добиться приемлемого фреймрейта посредством этой версии API.

Тестирование игры Forza Motorsport 5 на PC с DirectX 12. В системе была установлена видеокарта NVIDIA GeForce GTX Titan Black. Игра запускалась в разрешении 1080p и частотой кадров 60 fps

Помимо высокой производительности, DirectX 12 может похвастаться впечатляющей энергоэффективностью. По данным Microsoft, двенадцатая генерация API потребляет в среднем на 50% меньше энергии, чем ее предшественница. И это наглядно показало проведенное во время конференции SIGGRAPH 2014 тестирование платформы Surface Pro 3, оснащенной графическим процессором Intel HD4400.

Специально для тестов программисты Intel написали демо-приложение Asteroids. В Asteroids на экране одновременно отрисовываются 50 тысяч уникальных астероидов, каждый из которых имеет свою комбинацию вершин, текстур и констант. Приложение запускалось в двух режимах: DirectX 11 и DirectX 12. В первом тестовом прогоне сравнивалась энергоэффективность двух API. Для этого количество кадров в секунду блокировалось, и одна и та же сцена рендерилась сначала под управлением DirectX 11, а затем — DirectX 12. На картинке ниже можно увидеть, что энергопотребление CPU в режиме DirectX 12 уменьшилось наполовину. Отличный результат! И особенно важный для мобильной платформы.

Так выглядит приложение Asteroids. Справа внизу вы можете увидеть графики энергопотребление CPU (синий) и GPU (красный). После переключения в режим DirectX 12 энергопотребление CPU уменьшилось вдвое
Так выглядит приложение Asteroids. Справа внизу вы можете увидеть графики энергопотребление CPU (синий) и GPU (красный). После переключения в режим DirectX 12 энергопотребление CPU уменьшилось вдвое

Источник изображения

Результаты еще одного тестирования с фиксированным фреймрейтом. Результат такой же: при использовании DirectX 12 CPU потребляет примерно на 50% меньше энергии
Результаты еще одного тестирования с фиксированным фреймрейтом. Результат такой же: при использовании DirectX 12 CPU потребляет примерно на 50% меньше энергии

Источник изображения

Во втором тестовом прогоне измерялась производительность двух API. Само собой, количество кадров в секунду уже не фиксировалось. Неудивительно, что DirectX 12 вновь оказался впереди. Средний фреймрейт в режиме DirectX 12 составил 33 FPS против 19 FPS у DirectX 11 — еще немного, и прирост скорости составил бы 50%. Скриншоты и графики энергопотребления смотрите ниже.

Производительность системы в режиме DirectX 11
Производительность системы в режиме DirectX 11

Источник изображения

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

Источник изображения

Результаты еще одного тестового прогона без фиксированного фреймрейта. Ранее полученные результаты подтверждаются: при переключении в режим DirectX 12 GPU начинает работать быстрее
Результаты еще одного тестового прогона без фиксированного фреймрейта. Ранее полученные результаты подтверждаются: при переключении в режим DirectX 12 GPU начинает работать быстрее

Источник изображения

В общем и целом, результаты предварительных тестирований DirectX 12 оказались более чем положительными и обнадежили многих пользователей. Высказывались даже предположения, что новый API позволит достичь разрешения 1080p на Xbox One. Но стоит ли доверять столь ранним выводам, тем более сделанным самими разработчиками Microsoft?

Взгляд со стороны

Первым, кто посеял сомнения в тотальном превосходстве DirectX 12, стал глава Xbox Фил Спенсер. Отвечая на вопросы в Twitter, Спенсер сказал, что «DirectX 12 не привнесет каких-то масштабных изменений на Xbox One. Новый API лишь даст программистам больше свободы при создании новых проектов». Интерпретировать слова главы Xbox можно по-разному. Очевидно одно: даже если DirectX 11 игры начнут «переводить на рельсы» DirectX 12, большого прироста производительности на первых порах ожидать не стоит. Причина этого кроется в том, что программирование под DirectX 11 и DirectX 12 будет значительно различаться. И игры, разработанные с учетом всех ограничений DirectX 11, вряд ли смогут работать быстрее с DirectX 12 — как раз из-за этих самых ограничений одиннадцатой версии, заложенных на стадии проектирования приложений. Конечно, на помощь всегда может прийти оптимизация. Однако, на наш взгляд, по-настоящему раскрыть потенциал нового API смогут лишь заточенные под него игры.

Свою ложку дёгтя в бочку мёда добавил и программист компании CD Projekt RED Балаш Торок. По его словам, достичь разрешения 1080p на Xbox One будет непросто. «Думаю, многие просто не понимают, что и как будет упрощать DirectX 12, — говорит Торок. — В большинстве игр нагрузка на шейдерные блоки консоли очень велика. И новая версия DirectX эту ситуацию не исправит. Конечно, можно будет увеличить количество полигонов, но их все равно не получится сгладить. И в таком случае теряется весь смысл. Думаю, выход нового API повлияет лишь на то, как будут мыслить при разработке графические дизайнеры, вот и всё».

CD Projekt RED сейчас занимается разработкой игры The Witcher 3, выход которой запланирован на 24 февраля 2015 года на PC, Sony Playstation 4 и Xbox One
CD Projekt RED сейчас занимается разработкой игры The Witcher 3, выход которой запланирован на 24 февраля 2015 года на PC, Sony Playstation 4 и Xbox One

Источник изображения

Тем не менее в IT-индустрии преобладают позитивные настроения относительно DirectX 12. Например, о новом API довольно лестно отзывается Эндрю Лауритцен — ведущий инженер подразделения Advanced Technology Group компании Intel. «Девелоперы уже достаточно долго просили внести в API эти изменения (которые получил DirectX 12 — прим. автора), и пока что все ими довольны». Отвечая на вопрос о сравнении API, Лауритцен не стал делать никаких выводов об их производительности, сделав акцент лишь на ключевых различиях. По его словам, в плане архитектуры к DirectX 12 наиболее приближен API компании AMD Mantle. Что касается OpenGL, то этот интерфейс имеет много общего с одиннадцатой версией DirectX. О конкуренции между Mantle и DirectX 12 речи пока быть не может. «У Mantle и DirectX 12 похожие задачи, однако Mantle работает только на графических процессорах AMD. Эти API можно сравнивать только на AMD’шном железе, а для этого нам стоит дождаться официального выхода DirectX 12». Не забыл Лауритцен и об OpenCL, однако уточнил, что это скорее вычислительный API, не предназначенный для графики и более схожий с пакетом DirectCompute.

В положительном ключе о DirectX 12 высказался и представитель AMD Роберт Хэллок, отметив при этом, что не рассматривает интерфейс Microsoft как прямого конкурента Mantle. «DirectX 12, Mantle и OpenGL будут дополнять друг друга за счет своих уникальных возможностей», — сказал Хэллок. Как и Лауритцен, он отметил важность того, что в лице Mantle и DirectX 12 разработчики наконец-то получают похожие на консольные, низкоуровневые API для создания игр. Также представителю AMD был задан вопрос, не станет ли поддержка Mantle преимуществом для видеокарт Radeon в плане работы с низкоуровневым DirectX 12. «Пока что об этом сложно говорить, — ответил Хэллок. — Но к моменту запуска DirectX 12 разработчики будут работать с Mantle уже на протяжении 20-24 месяцев, поэтому это может сыграть нам на руку».

Шутер Battlefield 4 поддерживает API Mantle
Шутер Battlefield 4 поддерживает API Mantle

Источник изображения

Наконец, не остались в стороне от обсуждения нового API Microsoft и ведущие разработчики игр. О своем видении ситуации рассказал инженер Crytek Тьяго Соуза. «С точки зрения разработчика DirectX находился в стагнации уже несколько лет, — сказал Соуза. — Однако двенадцатая версия подоспела как раз вовремя. Изменения в новом API позволят нам решить растущие проблемы с рендерингом в реальном времени». Прокомментировал инженер Crytek и решенную проблему draw calls: «Теперь художники получат больше свободы и смогут рисовать более интересные уровни». Соуза также отметил, что многое, о чем программисты просили Microsoft, было реализовано в DirectX 12. Однако в одном моменте Microsoft пока что не пошла навстречу девелоперам: несмотря на их просьбы, операционная система Windows 7 не будет поддерживать новый API. Пока план таков. Не секрет, что многим игровым компаниям хотелось бы, чтобы DirectX 12 поддерживался на «семёрке», поскольку это значительно расширит потенциальный рынок для их продуктов.

Видеокарты NVIDIA прошлого поколения также будут поддерживать DirectX 12
Видеокарты NVIDIA прошлого поколения также будут поддерживать DirectX 12

Источник изображения

Раз уж мы заговорили о поддержке в операционных системах, то нужно сказать несколько слов и о том, какие устройства будут работать с DirectX 12. Как вы помните, раньше при переходе на новую итерацию API терял совместимость со старыми видеокартами. На этот раз ситуация иная: DirectX 12 будет работать с уже выпущенными графическими процессорами. Компания NVIDIA уже подтвердила, что видеокарты Fermi, Kepler и Maxwell будут поддерживать новый API. Компания AMD заявила о поддержке DirectX 12 семейством видеокарт с архитектурой Graphics Core Next. Поддерживать «директрису» будет и графика Intel Iris. Кроме того, работать с DirectX 12 будут и будущие процессоры Intel Skylake-S. Но даже несмотря на такую обратную совместимость, двенадцатая версия API таки получит некоторые новые функции, которые будут поддерживаться исключительно новейшими видеокартами.

Выводы

Архитектура DirectX 12 окончательно определила направление развития графических API, начало которому положила компания AMD со своим интерфейсом Mantle — разработчикам необходимы низкоуровневые программные интерфейсы. Ну а делать какие-то выводы о двенадцатой версии API пока что рано. Несмотря на то, что Microsoft четко описала основные изменения, которые получит новый программный интерфейс, разработка API пока далека от завершения. Официальный выпуск DirectX 12 запланирован на конец 2015 года, и за это время API еще может получить какие-либо интересные нововведения.

Похожие записи: