Я только начал изучать новый DirectX 12 API. Я хочу написать какой-то движок рендеринга поверх dx12, и во время инициализации я должен создать кучу дескрипторов. Проблема в том, что на данный момент я не знаю, сколько видов ресурсов я создам в будущем. например Если я хочу включить некоторые виды эффектов постобработки, которые требуют рендеринга к текстурным подходам, я должен создать целевые представления рендеринга для текстур, к которым я рендеринг. Количество этих RTV может варьироваться. Итак, как вы создаете кучи дескрипторов, достаточно большие, чтобы справиться с любой ситуацией?
Любой совет?
Идея с кучей дескрипторов состоит в том, чтобы иметь большой видимый графический процессор и несколько видимых процессорных. это потому что SetDescriptorHeaps
это дорогостоящая операция, вы не хотите вызывать ее более одного или двух кадров.
Вам нужно использовать большую видимую кучу gpu в качестве кольцевого буфера, выделяя место для текущей отрисовки или отправки, которую вы хотите подготовить и скопировать из различных видимых дескрипторов процессора, которые у вас есть для него. Вы можете иметь столько кучи видимых дескрипторов процессора, сколько хотите, это более или менее обычное размещение в объекте d3d.
Копия не имеет никакой защиты на весь срок службы и выполняется немедленно процессором, будьте осторожны, чтобы не перевернуть дескриптор, который все еще может использоваться на графическом процессоре.
Я говорю о SRV и сэмплерах здесь. RTV видны только процессору, и вы можете создавать столько кучи дескрипторов, сколько захотите, по одной на дескриптор, если вам нравится, и вам не все равно из-за издержек объекта d3d, это не повлияет на производительность во время выполнения.
Следует иметь в виду, что память дескрипторов практически не ограничена, большинство известных мне проектов имеют кучи дескрипторов размером до 1024 дескрипторов. Не говоря уже о DirectX 11 выделит до 128 дескрипторов для каждого отдельного шейдера. Так что не беспокойтесь, просто выделите несколько дескрипторов. Однако, если вы действительно хотите планировать каждый аспект памяти, я бы порекомендовал структурировать ваш движок так, чтобы он мог знать индивидуальные параметры каждой сетки и шейдера, которые будут отображаться в сцене.