Поделиться через


Выбор ресурса

Ресурс — это коллекция данных, используемых конвейером трехмерных данных. Создание ресурсов и определение их поведения является первым шагом к программированию приложения. В этом руководстве рассматриваются основные разделы по выбору ресурсов, необходимых приложению.

Определение этапов конвейера, которым требуются ресурсы

Первым шагом является выбор этапа графического конвейера (или этапов), который будет использовать ресурс. То есть определите каждый этап, который будет считывать данные из ресурса, а также этапы, которые будут записывать данные в ресурс. Зная этапы конвейера, в которых будут использоваться ресурсы, определяют API, которые будут вызываться для привязки ресурса к этапу.

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

Этап конвейера Вход и выход Ресурс Тип ресурса
Сборщик входных данных In Буфер вершин Buffer
Сборщик входных данных In Буфер индекса Buffer
Этапы шейдера In Шейдер-ResourceView Буфер, текстур1D, текстур2D, Текстур3D
Этапы шейдера In Буфер шейдер-констант Buffer
Поток выходных данных выход Buffer Buffer
Средство слияния вывода выход Представление целевого объекта отрисовки Буфер, текстур1D, текстур2D, Текстур3D
Средство слияния вывода выход Представление глубины и набора элементов Texture1D, Texture2D

 

Определение способа использования каждого ресурса

После выбора этапов конвейера, которые будет использовать приложение (и поэтому необходимые ресурсы), необходимо определить способ использования каждого ресурса, то есть доступ к ресурсу ЦП или GPU.

Оборудование, на котором работает приложение, будет иметь по крайней мере один ЦП и один GPU. Чтобы выбрать значение использования, рассмотрите, какой тип процессора требуется считывать или записывать в ресурс из следующих параметров.

Использование ресурсов Может быть обновлено с помощью Частота обновления
По умолчанию. GPU нечасто
Динамический ЦП путем создания моментального снимка диска
Промежуточная GPU Н/Д
Неизменяемые ЦП (только во время создания ресурсов) Н/Д

 

Использование по умолчанию должно использоваться для ресурса, который, как ожидается, будет обновляться ЦП редко (менее одного раза на кадр). В идеале ЦП никогда не будет записывать непосредственно в ресурс с использованием по умолчанию, чтобы избежать потенциальных штрафов за производительность.

Динамическое использование должно использоваться для ресурса, который ЦП обновляет относительно часто (один или несколько кадров). Типичным сценарием динамического ресурса будет создание динамических буферов вершин и индексов, которые будут заполнены во время выполнения данными о геометрии, видимой с точки зрения пользователя для каждого кадра. Эти буферы будут использоваться для отрисовки только геометрии, видимой пользователю для этого кадра.

Промежуточное использование следует использовать для копирования данных в другие ресурсы и из нее. Типичным сценарием будет копирование данных в ресурс с использованием по умолчанию (к которому ЦП не может получить доступ) к ресурсу с промежуточным использованием (к которому ЦП может получить доступ).

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

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

Как приложение использует ресурс Использование ресурсов
Загрузка один раз и никогда не обновляется Неизменяемый или по умолчанию
Приложение заполняет ресурс многократно Динамический
Отрисовка в текстуру По умолчанию.
Доступ К ЦП данных GPU Промежуточная

 

Если вы не уверены, какое использование следует выбрать, начните с использования по умолчанию, так как это, как ожидается, будет наиболее распространенным случаем. Буфер шейдер-Констант — это один тип ресурса, который всегда должен иметь использование по умолчанию.

Привязка ресурсов к этапам конвейера

Ресурс может быть привязан к нескольким этапам конвейера одновременно, пока ограничения, указанные при создании ресурса, выполняются. Эти ограничения указываются как флаги использования, привязка флагов или флагов доступа к ЦП. В частности, ресурс может быть привязан в качестве входных данных и выходных данных одновременно, если чтение и запись части ресурса не могут произойти одновременно.

При привязке ресурса думайте о том, как GPU и ЦП будут получать доступ к ресурсу. Ресурсы, предназначенные для одной цели (не используются несколько флагов доступа к ЦП, привязка и ЦП), скорее всего, приводят к повышению производительности.

Например, рассмотрим случай целевого объекта отрисовки, используемого в качестве текстуры несколько раз. Это может быть быстрее, чтобы иметь два ресурса: целевой объект отрисовки и текстуру, используемую в качестве ресурса шейдера. Каждый ресурс будет использовать только один флаг привязки, указывающий "целевой объект отрисовки" или "ресурс шейдера". Данные будут скопированы из текстуры целевой отрисовки в текстуру шейдера.

Этот метод в этом примере может повысить производительность, изолировав от чтения текстуры шейдера целевой объект отрисовки. Единственный способ убедиться в реализации обоих подходов и измерения разницы производительности в конкретном приложении.

Ресурсы