Страница 7: DirectX 12 и Maxwell

Maxwell – первая архитектура NVIDIA с поддержкой DirectX 12. Microsoft пока ещё не определилась с финальными требованиями DirectX 12, но NVIDIA уже поддержала все необходимые на сегодня спецификации. Но остаётся открытым вопрос, получите ли вы полную поддержку всех функций на аппаратном уровне.

Maxwell und DirectX 12
Maxwell и DirectX 12

В качестве доказательства готовности к DirectX 12 NVIDIA показала короткую демонстрацию Unreal Engine на основе DirectX 12. Разработчики сегодня могут получить доступ к комплекту разработчика Unreal Engine и Developer Kit от Microsoft, что позволяет начать работу над играми с поддержкой DirectX 12. Представитель Microsoft вновь подтвердил нынешние планы по выпуску DirectX 12, интерфейс планируется объявить к осени/зиме 2015. То же самое касается и выхода DirectX 11.3, который представляет собой программную реализацию функций DirectX 12 на уровне DirectX 11. Пока неизвестно, какое количество игр к тому моменту обзаведутся поддержкой нового API.

Доступность DirectX 12 для разработчиков была показана с помощью демо Fable:

Maxwell und DirectX 12
Maxwell и DirectX 12

Как мы уже отметили выше, финальный массив функций DirectX 12 пока не утвержден, поэтому во время презентации NVIDIA концентрировала внимание на том, что уже объявлено. Среди новых функций рендеринга можно отметить Rasterizer Ordered Views. Они играют важную роль в различных технологиях рендеринга и фильтрации. К ним относится сглаживание и технология Order Independent Transparency, которую мы обсудим ниже более детально.

Maxwell und DirectX 12
Maxwell и DirectX 12

Технология Order Independent Transparency описывает проблему, которая появляется в пути рендеринга и до сих пор не поддавалась решению. Для прозрачных объектов не всегда очевидно, в каком порядке их требуется представлять. Разработчикам приходилось тратить вычислительные ресурсы на решение этой проблемы, чтобы рендеринг был правильный, но при этом он оказывался довольно медленным. Если экономить на вычислительных расходах, то рендеринг может оказаться некорректным, и объекты, лежащие за прозрачным объектом, выводятся перед ним. Технология Rasterizer Ordered Views обеспечивает корректные вычисления, при этом не требующие существенной вычислительной производительности.

Maxwell und DirectX 12
Maxwell и DirectX 12

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

Maxwell und DirectX 12
Maxwell и DirectX 12

DirectX 12 также снимает ряд ограничений, связанных с недавним изменением архитектуры CPU и операционных систем с 32 на 64 бита. Многие переменные имели длину только 32 бита, что приводило к сбоям типов и значений данных.

Maxwell и DirectX 12Maxwell и DirectX 12

Maxwell и DirectX 12

Ещё один важный аспект DirectX 12 – тайловые ресурсы (Tiled Resources), которые обеспечивают высокую эффективность использования памяти, а также улучшают уровень детализации и открывают путь к использованию так называемых мегатекстур. С помощью использования мелких текстур в различных ориентациях можно симулировать крупные текстуры. При этом существенно экономится память. Возможно, придётся пойти на некоторые компромиссы по качеству картинки, но вовсе необязательно.

В первом примере вызывалась классическая 3D-текстура DirectX 11 с разрешением 1.200 x 600 x 600 пикселей в 32-бином цвете размером 1,6 Гбайт. Затем то же самое качество текстуры было достигнуто с помощью тайловой 3D-текстуры разрешением 32 x 32 x 16 пикселей с 32-битной глубиной цвета и размером 156 Мбайт, которая просто использовалась несколько раз. В одном из примеров приводилась сцена рендеринга, в котором тайловую 3D-текстуру удавалось использовать 2.500 раз.

Maxwell und DirectX 12
Maxwell и DirectX 12

Третий важный момент в DirectX 12 касается консервативной растеризации (Conservative Rasterization). Она касается ситуаций использования фильтров Dynamic Super Resolution и Multi Frame Sampled Anti-Aliasing.

Maxwell und DirectX 12Maxwell und DirectX 12

Maxwell и DirectX 12

При растеризации небольшого объекта или пикселя результат часто зависит от удачного расположения точек семплирования. Иногда это приводит к несоответствию желаемому результату, поэтому лучше считать покрытыми и частично занятые участки, чтобы их тоже учесть. Технология Conservative Rasterization важна и для вокселизации VXGI. Для работы Conservative Rasterization требуются определенные аппаратные ресурсы, поэтому технология будет работать только на новых GPU.

Maxwell und DirectX 12
Maxwell и DirectX 12

В DirectX 11 Microsoft использовала так называемые состояния (States) для описания ортогональных объектов. В результате несколько состояний (Input Assembler States, Pixel Shader States, Rasterizer States и Output Merger States) можно было изменять независимо. Такой подход обеспечивал хорошую гибкость в программировании графического конвейера, но он не лучшим образом соответствует принципу работы современных GPU. Например, производители GPU объединяют Pixel Shader State и Output Merger State в отдельном аппаратном блоке. Но из-за независимости этих компонентов в DirectX 11, драйверу не всегда удавалось своевременно учесть все состояния, чтобы составить полную характеристику объекта – в результате появлялись задержки вывода финального кадра (Draw Time). Задержки приводили к тому что конвейер обрабатывал меньше операций Draw Call на кадр.

Maxwell und DirectX 12
Maxwell и DirectX 12

Новая модель Bind Model в Microsoft DirectX 12 лучше ориентирована на большое количество ядер CPU, она обеспечивает более высокую производительность и более широкую параллельную обработку. Также снижается и избыточная вычислительная нагрузка на CPU. Произошли изменения и со списками команд (Command Lists). Так называемые списки команд под DirectX 11 позволяют выполнять бесконечную последовательность команд на GPU. Но они тоже не очень хорошо соответствуют многозадачной природе GPU, поскольку команды в списке необходимо обрабатывать последовательно, планировщику приходится распределять команды максимально эффективно, что не всегда получается сделать идеально.

DirectX 12 больше не отсылает линейный список команд через драйвер на GPU, вместо этого используется четко определенный и конечный список, который содержит некоторое количество задач, необходимых для выполнения на GPU, и он оптимизирован под возможности и производительность аппаратной части. Во время обработки списка команд на GPU, драйвер, на основе нагрузки предыдущего списка, создаёт новый, который должен быть готов для выполнения после завершения текущего. Затем один последовательный процесс сводит списки вместе, но данный подход оказывается намного более эффективным, чем создание большого последовательного списка команд. Так называемые бандлы (Bundles) можно рассматривать как следующую ступень эволюции списка команд. Если необходимо рассчитать кадр, например, с двумя объектами, которые отличаются только текстурами, то во время первого прохода можно записать список команд, который затем требуется просто повторить без всех операций, сопутствующих первому проходу. Так что все инструкции и команды создаются только один раз.

Maxwell und DirectX 12
Maxwell и DirectX 12

DirectX 12 теперь объединяет различные состояния вместе в объект под названием Pipeline State Object (PSO). Теперь аппаратное и программное обеспечение оперирует полными блоками, которые можно намного быстрее вычислять на аппаратных ресурсах. Объекты PSO можно изменять динамически, при этом их не требуется вычислять каждый раз полностью. Всё это должно привести к выполнению большего числа операций Draw Calls на кадр, что приведёт к возможности увеличить число объектов в кадре или повысить частоту кадров.

Maxwell und DirectX 12
Maxwell и DirectX 12

Два, четыре, шесть или даже восемь ядер вместе с технологией Hyper-Threading быстро приводят к значительному количеству виртуальных ядер (до 12), которые требуется нагрузить со стороны программного обеспечения. Как правило, до сих пор удавалось нагрузить только несколько ядер. Хорошие игровые движки умеют нагружать до пяти-шести ядер, но об их эффективном использовании говорить не приходится. Для демонстрации распределения нагрузки Microsoft взяла версии DirectX 11 и DirectX 12 пакета 3DMark от Futuremark, после чего показала загрузку ядер CPU. В верхнем случае задачи были разбиты на четыре потока, на расчет потребовалось довольно много времени CPU, поскольку Thread0 не смог распределить часть своих задач на остальные свободные потоки.

Под DirectX 12 следует отметить два момента. Во-первых, задачи лучше распределились по четырем потокам (например, это касается задачи "UM Driver"). Во-вторых, у DirectX 12 снизилась избыточная вычислительная нагрузка, то есть ненужные вычисления, что привело к выполнению отдельных задач за меньшее время. Подобное сокращение вычислительного времени CPU приводит к снижению задержек, когда GPU приходится ждать данных от CPU, что даёт, в конечном итоге, большую частоту кадров.

В целом, картина DirectX 12 и предлагаемых функций пока не сложилась. Сложно удержать в голове все аппаратные и программные функции, и пока не совсем понятно, какие из упомянутых функций потребуют выделенных аппаратных блоков, а какие – нет. Для некоторых примеров мы указали аппаратные требования, для других они пока остаются в тумане. Скорее всего, это и приведёт к отличиям в поддержке DirectX 12 и 11.3, разница будет заключаться в программной или аппаратной поддержке функций.