Важные изменения с Direct3D 11 на Direct3D 12
Direct3D 12 представляет значительный отход от модели программирования Direct3D 11. Direct3D 12 позволяет приложениям ближе к оборудованию, чем когда-либо раньше. Благодаря более близкому к оборудованию Direct3D 12 быстрее и эффективнее. Но компромисс приложения с увеличением скорости и эффективности с Direct3D 12 заключается в том, что вы несете ответственность за больше задач, чем вы были с Direct3D 11.
- явной синхронизации
- управление расположением физической памяти
- объекты состояния конвейера
- списки команд и пакеты
- кучи дескриптора и таблицы
- перенос из Direct3D 11
- связанные разделы
Direct3D 12 — это возвращение к низкоуровневой программе; он обеспечивает более полный контроль над графическими элементами игр и приложений, введя эти новые функции: объекты для представления общего состояния конвейера, списков команд и пакетов для отправки рабочих работ, а также куч и таблиц дескриптора для доступа к ресурсам.
Ваше приложение увеличило скорость и эффективность с Direct3D 12, но вы несете ответственность за больше задач, чем вы были с Direct3D 11.
Явная синхронизация
- В Direct3D 12 синхронизация CPU-GPU теперь является явной ответственностью приложения и больше неявно выполняется средой выполнения, так как она находится в Direct3D 11. Этот факт также означает, что автоматическая проверка рисков конвейера не выполняется Direct3D 12, поэтому снова это ответственность за приложения.
- В Direct3D 12 приложения отвечают за конвейерные обновления данных. То есть шаблон Map/Lock-DISCARD в Direct3D 11 должен выполняться вручную в Direct3D 12. В Direct3D 11, если GPU по-прежнему использует буфер при вызове ID3D11DeviceContext::Map с D3D11_MAP_WRITE_DISCARD, среда выполнения возвращает указатель на новый регион памяти вместо старых данных буфера. Это позволяет GPU продолжать использовать старые данные, пока приложение помещает данные в новый буфер. В приложении не требуется дополнительное управление памятью; Старый буфер повторно используется или уничтожается автоматически при завершении работы с GPU.
- В Direct3D 12 все динамические обновления (включая буферы констант, динамические буферы вершин, динамические текстуры и т. д.) явно управляются приложением. Эти динамические обновления включают все необходимые ограждения GPU или буферизацию. Приложение отвечает за сохранение доступной памяти до тех пор, пока оно больше не понадобится.
- Direct3D 12 использует подсчет ссылок в стиле COM только для времени существования интерфейсов (используя слабую эталонную модель Direct3D, привязанную к времени существования устройства). Все сроки существования памяти ресурсов и описания являются единственным ответственной частью приложения для поддержания в течение правильной длительности и не учитываются. Direct3D 11 также использует подсчет ссылок для управления временем существования зависимостей интерфейса.
Управление расположением физической памяти
Приложение Direct3D 12 должно предотвратить условия гонки между несколькими очередями, несколькими адаптерами и потоками ЦП. D3D12 больше не синхронизирует ЦП и GPU, а также не поддерживает удобные механизмы переименования ресурсов или много буферизации. Ограждения должны использоваться для предотвращения нескольких единиц обработки от перезаписи памяти, прежде чем другая единица обработки завершит работу с ним.
Приложение Direct3D 12 должно гарантировать, что данные хранятся в памяти, пока GPU считывает его. Память, используемая каждым объектом, создается в процессе создания объекта. Приложения, которые вызывают эти методы, должны использовать ограждения, чтобы гарантировать, что GPU не обращается к объектам, которые были вытеснены.
Барьеры ресурсов — это другой тип синхронизации, используемый для синхронизации переходов ресурсов и подресурсов на очень детализированном уровне.
Сведения об управлении памятью в Direct3D 12.
Объекты состояния конвейера
Direct3D 11 позволяет управлять состоянием конвейера с помощью большого набора независимых объектов. Например, состояние сборщика входных данных, состояние шейдера пикселей, состояние растеризатора и состояние слияния выходных данных можно изменить независимо. Эта конструкция обеспечивает удобное и относительно высокоуровневое представление графического конвейера, но не использует возможности современного оборудования, в первую очередь потому, что различные состояния часто являются взаимозависимыми. Например, многие графические процессоры объединяют шейдер пикселей и состояние слияния выходных данных в одно аппаратное представление. Но так как API Direct3D 11 позволяет задавать эти этапы конвейера отдельно, драйвер отображения не может устранить проблемы состояния конвейера до завершения, пока состояние не будет завершено. Эта схема задерживает настройку состояния оборудования, что означает дополнительные затраты и меньше вызовов максимального числа вызовов рисования на кадр.
Direct3D 12 устраняет эту схему, объединяя большую часть состояния конвейера в неизменяемые объекты состояния конвейера (PSOS), которые завершаются при создании. Затем оборудование и драйверы могут немедленно преобразовать PSO в любые собственные инструкции и состояние оборудования для выполнения работы GPU. Вы по-прежнему можете динамически изменять, какой PSO используется, но для этого оборудование должно скопировать минимальное количество предварительно вычисляемого состояния непосредственно в регистры оборудования, а не вычислять состояние оборудования на лету. С помощью PSOs затраты на вызовы на рисование значительно сокращаются, и на кадр может возникать много вызовов рисования. Дополнительные сведения о PSOS см. в разделе Управление состоянием графического конвейера в Direct3D 12.
Списки команд и пакеты
В Direct3D 11 все рабочие отправки выполняются с помощью непосредственного контекста, который представляет один поток команд, которые отправляются в GPU. Для достижения многопоточного масштабирования игры также имеют отложенные контексты доступны для них. Отложенные контексты в Direct3D 11 не сопоставляются идеально с оборудованием, поэтому относительно мало работы можно сделать в них.
Direct3D 12 представляет новую модель для отправки рабочих данных на основе списков команд, содержащих всю информацию, необходимую для выполнения определенной рабочей нагрузки на GPU. Каждый новый список команд содержит такие сведения, как использование PSO, необходимые ресурсы текстуры и буфера, а также аргументы для всех вызовов рисования. Так как каждый список команд является автономным и не наследует состояние, драйвер может предварительно вычислить все необходимые команды GPU вперед и в свободном потоке. Единственным последовательным процессом является окончательная отправка списков команд на GPU через очередь команд.
Помимо списков команд Direct3D 12 также представляет второй уровень предварительного вычисления работы: пакеты. В отличие от списков команд, которые полностью автономны и обычно создаются, отправляются один раз и отменяются, пакеты предоставляют форму наследования состояний, которая разрешает повторное использование. Например, если игра хочет нарисовать две модели символов с разными текстурами, один из способов заключается в записи списка команд с двумя наборами идентичных вызовов рисования. Но другой подход заключается в том, чтобы записать один пакет, который рисует одну символьную модель, а затем дважды воспроизвести пакет в списке команд с помощью разных ресурсов. В последнем случае драйвер отображения должен вычислить соответствующие инструкции один раз, и создание списка команд в основном составляет два вызова функции с низкой стоимостью.
Дополнительные сведения о списках команд и пакетах см. в рабочей отправке в Direct3D 12.
Дескрипторные кучи и таблицы
Привязка ресурсов в Direct3D 11 очень абстрагирована и удобна, но оставляет множество современных возможностей оборудования недостаточно. В Direct3D 11 игры создают представления объектов ресурсов, а затем привязывают эти представления к нескольким слотам на различных этапах шейдера в конвейере. Шейдеры, в свою очередь, считывают данные из этих явных слотов привязки, которые фиксируются во время рисования. Эта модель означает, что всякий раз, когда игра будет рисовать с помощью разных ресурсов, она должна повторно привязать различные представления к разным слотам и снова вызвать рисование. Этот случай также представляет собой издержки, которые можно устранить, полностью используя современные аппаратные возможности.
Direct3D 12 изменяет модель привязки на соответствие современному оборудованию и значительно повышает производительность. Вместо того чтобы требовать автономных представлений ресурсов и явного сопоставления с слотами, Direct3D 12 предоставляет дескриптор кучу, в которой игры создают различные представления ресурсов. Эта схема предоставляет механизм для непосредственной записи описания ресурсов на основе оборудования (дескриптора) gpu в память. Чтобы объявить, какие ресурсы должны использоваться конвейером для определенного вызова рисования, игры указывают одну или несколько таблиц дескриптора, представляющих под диапазоны полной кучи дескриптора. Так как куча дескриптора уже заполнена соответствующими данными дескриптора для конкретного оборудования, изменение таблиц дескриптора является чрезвычайно низкой стоимостью.
Помимо повышения производительности дескриптора куч и таблиц, Direct3D 12 также позволяет динамически индексировать ресурсы в шейдерах, что обеспечивает беспрецедентную гибкость и разблокирует новые методы отрисовки. Например, современные механизмы отложенной отрисовки обычно кодируют идентификатор материала или объекта определенного типа в промежуточный g-буфер. В Direct3D 11 эти механизмы должны быть осторожны, чтобы избежать использования слишком большого количества материалов, так как в том числе слишком много в одном g-буфере может значительно замедлить окончательный проход отрисовки. С динамически индексируемыми ресурсами сцена с тысячами материалов может быть завершена так же быстро, как один с только десятью.
Дополнительные сведения о кучах и таблицах дескриптора см. в привязки ресурсов и различия в модели привязки от Direct3D 11.
Перенос из Direct3D 11
Перенос из Direct3D 11 — это участвующий процесс, описанный в разделе Перенос из Direct3D 11 в Direct3D 12. Также см. диапазон параметров в работе с Direct3D 11, Direct3D 10 и Direct2D.
Связанные разделы