2017-01-15 12 views
0

В настоящее время я пишу свой собственный графический фреймворк для DirectX12 (я уже написал несколько фреймворков DirectX 11 для персональных игровых движков), и я в настоящее время trying to copy the methods used in the recent Hitman game для привязки ресурсов.DirectX 12 Обновление кучи дескриптора

Я смущен о наилучшем способе обработки привязки ресурса каждого объекта для кучи SRV/CBV/UAV. Я смотрел несколько презентаций GDC, и все они, похоже, замалчивают это.

Только 1 куча SRV/CBV/UAV может быть привязана за один раз, а переключение в настоящее время кучи в середине списка команд может быть плохой для производительности на некоторых аппаратных средствах, заставляя флеш. Из-за этого, каков наилучший способ обработать обновление кучи новыми дескрипторами? Мне кажется, что каждый командный список:

  1. Обхватите кучу SRV/CBV/UAV для себя.
  2. Для каждого объекта в подмножестве объектов создайте дескрипторы в куче, указывающие на данные каждого объекта, которые были помещены в отдельную кучу загрузки.
  3. Впоследствии другой список команд принимает эту заполненную дескрипторную кучу и связывает ее, затем выдает вызовы draw, смешанные с SetGraphicsRootDescriptorTable, чтобы переместиться через текущую кучу дескриптора.

Это, как говорится, несколько источников в Интернете (including another SO post) предлагают использовать один большой SRV/CBV/Л кучу и копирование в нее с помощью CPU-видимой кучи. Я предполагаю, что они не пытаются использовать асинхронный CopyDescriptors, а скорее CopyBufferRegion. Я попытался использовать CopyBufferRegion для обновления данных для каждого объекта, но для меня это кажется недостаточно-эффективным с таким количеством переходов между D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER и D3D12_RESOURCE_STATE_COPY_DEST. Я что-то не понимаю? Любая ясность будет оценена по достоинству.

+1

Не забудьте взглянуть на [MiniEngine] (https://github.com/Microsoft/DirectX-Graphics-Samples/tree/master/MiniEngine) и [DirectX Tool Kit для DirectX 12] (https://github.com/Microsoft/DirectXTK12) для примера кода для подходов к решению этой проблемы. –

ответ

1

CopyDescriptors не является асинхронным, это операция центрального процессора, которая находится непосредственно на CPU. Это может произойти в любое время до того, как будет исполнен список команд для волатильного дескриптора (после того, как операция списка команд с использованием его записана) или должна быть готова к использованию для статического дескриптора (корневая подпись 1.1).

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

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

+0

Итак, если я использую 'CopyDescriptors', когда он обновляет кучу на стороне GPU? Когда я вызываю 'SetGraphicsRootDescriptorTable'? – cehnehdeh

+0

Нет, CopyDescriptors немедленно, как только он вернется, копия завершена. Единственная сложная вещь - это корневая подпись 1.0 против 1.1. 1.0 и volatile table не предполагают, что дескриптор готов, когда вы используете их на CPU, они предполагают, что они будут здесь, когда вы закроете список команд. 1.1 с статической таблицей предполагают, что дескриптор готов, когда вы устанавливаете их для запуска ничьей и что после этого они не будут меняться. – galop1n

+0

Итак, если я создаю несколько объектов, каждый с уникальными данными cbuffer, я бы назвал 'CopyDescriptors' для обновления кучи дескриптора с другим смещением для каждого объекта? – cehnehdeh