Microsoft — мировой лидер в области ПО и ИТ-услуг
452,59
рейтинг
21 марта 2014 в 07:02

Разработка → DirectX 12


20 марта, в рамках конференции GDC 2014, состоялся анонс следующей версии DirectX 12. Основным ядром DirectX являетcя Direct3D, именно на нем создаются наиболее критичные компоненты игровых приложений. Команда разработки внесла ряд изменений в Direct3D, в результате которых возросла скорость и эффективность многих графических операций. Эти изменения позволяют создавать более детальные сцены и достичь полного использования возможностей современных GPU. Но эти возможности появятся не только в «хай-энд» игровых компьютерах. Direct3D 12 будет работать на всех устройствах Microsoft. Телефоны, планшеты, ноутбуки, десктопы и конечно, Xbox One, все они позволят использовать API Direct3D 12.

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

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

Да, чтобы не забыть – DirectX 12 будет работать на многих существующих видеокартах.

Это маркетинговая уловка?


Команда разработки прочитала множество комментариев в твиттере и форумах, в которых часто задается вопрос – это действительно технологическое обновление или маркетинговый отдел просто получил бюджет на раскрутку нового индекса к версии? Все что вы прочитаете ниже исходит напрямую от команды которая занимается разработкой DirectX на протяжении 20 лет.

Это именно наша работа — создавать API, и мы работали вместе с нашими партнерами производителями ПО и железа, для того чтобы доказать значительные улучшения производительности Direct3D 12. Те новинки, которые включены в Direct3D 12, не являются хаками каких-то микро-бенчмарков. Цифры, которые мы получили, базируются на коммерческих играх и признанных бенчмарках, протестированных на альфа версии. Скриншоты, которые вы увидите были сделаны на реальных Direct3D 12 приложениях с реальной реализацией рантайма и драйверов Direct3D 12.

3DMark – поточное масштабирование +50% к утилизации CPU


Если вы заядлый геймер, то наверняка знаете о 3DMark. Это отличный инструмент оценки производительности на большом спектре устройств и железе. 3DMark работающий на Direct3D 11 позволяет использовать поточное масштабирование, но из-за некоторых накладок, связанных с рантаймом и драйверами, существует холостое время ожидания потоков и ядер. После переноса 3DMark на Direct3D 12 мы увидели два значительных улучшения – 50% прироста к утилизации CPU и улучшение распределения работы между потоками.


Direct3D11

Direct3D 12


Forza Motorsport 5 Tech Demo – консольная эффективность на PC


Forza Motorsport 5 это пример игры которая выжимает максимум из XboxOne. Под капотом Forza находится низкоуровневый API взаимодействия с графической подсистемой консоли. Традиционно, такой уровень эффективности достижим только на унифицированном железе. Теперь такая возможность, даже в альфа версии, есть и на компьютере, и даже на телефоне. При переносе кода графического ядра, базирующегося на Direct3D 11.1, команда Turn 10 добилась такого же уровня оптимизации на PC, и все благодаря возможностям Direct3D 12.


Откуда взялась такая производительность?


Direct3D 12 отходит от старой модели программирования Direct3D 11, позволяя приложению быть значительно ближе к железу как никогда ранее. Мы пересмотрели значительное количество областей API ключевыми из которых являются механизмы представления состояний конвейера, методы отправки заданий и доступ к ресурсам.

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


Direct3D11 позволяет манипулировать состояниями конвейера через большой набор перекрестных объектов. Например, состояние входного ассемблера, состояние пиксельного шейдера, состояние растеризатора и состояние выходного смесителя, все они могут быть изменены независимо. Этот механизм предоставляет удобный, относительно высокоуровневый уровень представления графического конвейера, но к сожалению, он не очень хорошо ложится на современное железо. В первую очередь из-за того, что существуют взаимозависимости между многими состояниями. Например, многие GPU комбинируют состояние пиксельного шейдера и выходного смесителя в одно аппаратное представление. Direct3D 11 API позволяет менять их состояние независимо, но драйвер не может разрешить это пока не будет знать что состояние завешено, а это не возможно до начала отрисовки. Это приводит к задержкам при установке состояний железа, означает издержки и меньшее количество вызовов отрисовки на каждый кадр.

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

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


В Direct3D 11 все задания отправляются с помощью непосредственного контекста, который представляет один ряд команд, отправляющихся в GPU. Для многопоточного масштабирования производительности игры используют отложенные контексты, но, как и в случае ОСК, отложенные контексты не соответствуют реальному положению вещей в железе.
Direct3D 12 предоставляет новую модель для отправки заданий, базирующуюся на списках команд. Они содержат всю необходимую информацию для исполнения в GPU. В список команд входит ОСК, текстурные и буферные ресурсы, а также аргументы для команды отрисовки. В связи с тем, что список команд автономен и не содержит состояния, драйвер может заранее просчитать необходимые GPU команды в независимом потоке. Необходим лишь процесс сериализации при финальной отправке списка команд в GPU который производится через очередь команд, и этот процесс очень эффективен.

В дополнение к спискам команд, в Direct3D 12 включен механизм вторичного предварительного вычисления с помощью пакетов. В отличие от списков команд, которые полностью автономны, и обычно создаются, отправляются для выполнения, а затем уничтожаются, пакеты предоставляют некую форму независимости от состояния и подразумевают повторное использование. Например, если игре необходимо отобразить две модели персонажей с разными текстурами, одним из подходов будет запись списка команд с двумя наборами идентичных вызовов отрисовки. Другим подходом является запись одного пакета который отрисует одного персонажа, а затем «перемотки назад» пакета дважды в списке команд, используя разные ресурсы. В последнем случае драйверу необходимо вычислить инструкции только единожды, а создание списка команд по существу равно двум вызовам функций с низкой стоимостью.

Дескрипторы кучи и таблицы


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

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

В дополнение к улучшениям, связанным с дескрипторной кучей и таблицами, Direct3D 12 позволяет динамически индексировать ресурсы в шейдерах. Это предоставляет беспрецедентную гибкость и открывает дорогу к новым техникам рендера. Например, современные движки рендера, основанные на отложенном подходе, часто кодируют материал или идентификатор объекта какого-то типа в предварительный g-буфер. В Direct3D11 такие движки должны быть осторожны в использовании слишком большого количества материалов, так как включение множества g-буферов может значительно снизить скорость финального прохода отрисовки. Вместе с динамически индексируемыми ресурсами, сцена с тысячей материалов может быть финализирована так же быстро как и с десятью.

Хотите быть одним из первых?


Если вы профессиональный разработчик игр и предполагаете, что Direct3D 12 может ускорить производительность вашего приложения, вы можете подать заявку на участие в предварительной программе ознакомления.
Автор: @dmandreev
Microsoft
рейтинг 452,59
Microsoft — мировой лидер в области ПО и ИТ-услуг

Комментарии (48)

  • +24
    В статье не хватает видео техдемки
    которая выжимает максимум
    0.941 против 5.156, очень круто, даже не смотря на то что я с трудом представляю что значат эти цифры.
    • –37
      О, тут ничего сложного. Цифры это символы, которыми записываются числа. Как буквы и слова.
      • +52
        Совершенно верный, но совершенно бесполезный ответ ))
        • –1
          Элементарно, Ватсон, мы в России!
    • +1
      Чем меньше это значение, тем лучше — идет выигрыш, измеряемый кадрами в секунду.
      К примеру, если кадр обрабатывается в среднем за 0.025, то это 40 fps,
      а если за 0.01, то это уже 100 fps.

      Немного критики статье
      Возможно, «total cpu time» говорит о затратах на cpu со старта демки. В этом случае скриншоты бесполезны и это чистый пиар.
      Вообще, я очень удивился, что запись от блога Майкрософт. Тут есть более интересные графики.
    • +1
      Думаю на картинке Direct3D 12 в первую очередь важно более равномерное распределение цифр по 4 Thread.

      И от этого

      Direct3D11 Total CPU time: 0006.662ms
      Direct3D12 Total CPU time: 0003.208ms

      круче в 2 раза
  • +12
    Mantle заставила шевелится…

    Но вопрос в другом, какие OS будут поддерживаться этим DX12 судя по всем Win 8.1 и выше?
    • +1
      Интересно будут ли все видеокарты с поддержкой DX11 поддерживать DX12 или это будет ограниченный (по какому-то параметру) список.
      NVIDIA в следующей версии драйверов как раз отказывается от поддержки DX10.
      • +1
        Не все, будет список. У Nvidia таких карт будет больше.
      • 0
        На конференции говорили, что многие возможности DX12 можно будет заполучить на видеокартах текущего поколения после выпуска соответствующих драйверов.
    • +4
      Бабки у подъезда говорят, что для win7 тоже будет.
      • +4
        Учитывая что под него даже 11.2 не стали выпускать?
    • +7
      Поддерживаю!

      Какого чёрта DX11.2 не ставится на мою вполне легальную Windows 7?
      Будет ли апдейт DX12 для семёрки?
      • +6
        Это чтобы ты не сидел, довольный, на семерке 100500 лет, как это было с XP. Т.е. для того чтобы _заставить_ хомячков обновлять винду. Ну и привитие любви к плиточным дизайнерским изыскам Microsoft.
        • +1
          Хотелось бы всё же дождаться ответа представителя Microsoft в этой ветке)
      • +1
        Хотят развития Игр на Linux. Вон gog уже подоспел.
    • +3
      Забавно, конечно, что одновременно у OpenGL аналогично рассказывают про снижение оверхеда в драйверах и увеличения в целом производительности «by up to 10x or more». Причем и «available in today's OpenGL implementations».
      Жесткая конкуренция и повсеместный маркетинг из разных лагерей :)
      • +1
        Однако следует заметить, что OpenGL — это аналог Direct3D, а не всего пакета DirectX, поэтому такое сравнение не совсем корректно (касательно конкуренции)
        • +2
          Так в посте и не обсуждается DirectInput, DirectSound и другие части DX. Речь именно в контексте работы с видеокартами.
          • +1
            Тогда приношу извинения. Неправильно определил контекст по заголовку статьи.
  • +1
    команда Turn 10 добилась такого же уровня оптимизации на PC

    60fps на NVIDIA GeForce Titan Black. Вроде ведь не такое и достижение?
  • +29
    На скриншотах понравились надписи «Microsoft Confidential. Do not distribute»…
  • +3
    Видеокарты да.

    А вот про 7-ку придётся забыть, видимо.
  • –2
    Пошевелится заставили Valve, они как раз об этих недостатках вроде писали, когда поясняли почему у них под linux больше fps получился (ну после того конечно как они все косяки драйверов nvidia починили).
    • +2
      >>когда поясняли почему у них под linux больше fps получился
      Маркетинг Гейба
      habrahabr.ru/post/215559/#comment_7397213
    • +2
      А вы сами то fps проверяли? У меня в Linux source-based игры показывают в среднем в 2 раза меньше fps.
      • 0
        Unigine Heaven на моей GTX650 на ubuntu у меня выдает на несколько FPS больше, чем под win7.
        Так что вопрос к железу и дровам, видимо.
        • 0
          Я про движок Source, который использует транслятор Direct3D -> OpenGL. Unigine никак не относится к Valve, и возможно имеет OpenGL рендер, отсюда и маленькая разница в производительности.

          У меня две gt650m, тесты проводились на одной, т.к. драйверы nvidia не поддерживает sli на мобильных картах под linux. Что является ещё одним камнем в огород в сторону зарождающегося костяка linux-gaming. Но я свято верю в лучший мир.
      • 0
        Я проверял — в доте и l4d fps в среднем одинаковый.
        • +1
          В доте у меня на максималках в винде такой же фпс, как на минималках в убунте (за исключением разрешения и качества рендера).
          • 0
            Ну… что-то где-то не так. У меня в Арче показатели идентичны виндовым, все на максимуме в обеих играх

            На всяких случай уточню, что речь о системе с Nvidia 560Ti и проприетарными дровами
            • 0
              Если желаете, можем помериться письками. Сделаю тесты, подготовлю результаты, отвечу вам. Ну и от вас жду того же.
              • 0
                Отправил)
  • +1
    Есть ли сравнительные тесты с последней версией OpenGL?
  • +19
    Помню как во время активной PR-кампании Vista и DirectX 10 обещали такой графон:

    image

    В реальности же получили такое:

    Вариант 1
    image


    Вариант 2
    image


    С тех пор нет особого доверия к маркетинговым материалам от MS :)
    • –1
      Без активных «сlick here» ничего не разобрать. Да и картинки какие-то странные — слабо было камеру пониже опустить?
      • +2
        погуглите на «directx 9 directx10 microsoft flight simulator»
    • +14
      Все эти картинки графона — маркетологический бред, ИМХО.
      Графон зависит от программиста и от дизайнеров, но вообще никак не зависит от API. Просто более новые API позволяют реализовывать некоторые техники более прозрачно и проще. Возможно от API будет зависеть FPS.
      Серьезно, когда, например, показывают скриншот с демкой на DirectX и демкой на OpenGL, в которой на OpenGL демке графон хуже или еще что — это бред. Все что делают современные видеокарты — просто считают. Так что сравнивать API таким образом, это все равно что сравнивать результаты работы python скрипта и C++ программы и говорить мол: в программе на языке X матрица посчиталась не с той точностью.
      • 0
        очевидно, что технические детали понятны читателям Хабры, но просто маркетинговые материалы ясно демонстрировали обывателю зачем нужно было обновляться до Vista только на которой в то время работал DirectX10.
        • 0
          А это означает, что пользователей обманывали. Не больше и не меньше.
  • 0
    «Пакеты и списки команд» по поверхностному обзору в посте очень напоминает дисплейные списки из первой версии OpenGL.
  • –1
    Не забываем, что новая верися DirectX издревле привязывалась к выходу новой версии Windows и поддерживалась только новым поколением видеокарт.
    • 0
      Это было до появления Feature Levels.
  • +1
    > Direct3D 12 будет работать на всех устройствах Microsoft. Телефоны, планшеты, ноутбуки, десктопы и
    > конечно, Xbox One, все они позволят использовать API Direct3D 12.

    Наверное, это описка, но, во-первых, не припомню ни одного «десктопа» от MS, во-вторых, не на всех устройствах DX заведется — у меня вот клава от MS, так на ней никак :)

    На самом деле, я хочу попросить поменьше маркетинга, и побольше технических подробностей приводить. Например, минимальные системные требования были бы в тему. А то прочитаешь фразу:

    > +50% к утилизации CPU

    и начинаешь переживать: непонятно, это для той же красоты нужен в два раза более мощный процессор (откуда ему взяться, скажем, если говорим про смартфоны или консоли?), или +50% загрузки проца дадут волшебную, неземную красоту — но тогда откуда она возьмется, если в игру заранее не заложена? А если говорим про красоты новых версий игр, так они и без нового DX будут просить новый процессор почти все…

    А тут пост смахивает не неплохо, но автоматом (как статьи TechNet-а), переведенный англоязыкий пресс-релиз, и читается соответственно.
  • –1
    Даешь Forza Motorsport на PC!
  • +19
    консольная эффективность на PC
    Мои игры будут в 720р@30fps?
    Нет, спасибо.
  • 0
    Все это очень здорово, но все же немного грустно.
    Для ДХ11 говорили — он стал еще круче ДХ10, оптимизировали, быстрее, выше, сильнее. Будет все здорово!
    Теперь у нас ДХ12. Оказалось, в ДХ11 были неполадки, ограничения, но сейчас-то точно все будет зашибись.

    Но в целом, какая была цель разработки ДХ12 в паре слов? Оптимизация (чтобы прежняя графика быстрее работала или была детализированнее), новые возможности (грубо говоря, раньше сфера были квадратные, теперь идеально круглые).

    PS лет 15 назад говорили при кривые Безье. Мол оно сможет сделать поверхности идеально плавными. про тесселяцию тогда и не знали. Что с ними сейчас стало? Неужели тесселяция ДХ11 эффективнее по качестве и скорости?
    • +1
      Какова цель — бессмысленный вопрос.
      Цель любой коммерческой организации — максимализация прибыли. Microsoft — коммерческая организация, код там пишут не для того чтобы мир улучшить, а для получения прибыли.
      Даже если DirectX версии N был бы идеален, то следовало бы придумать причину, по которой надо было бы написать и продвинуть версию N+1.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка