Стратегии управления памятью

Диспетчер памяти для Direct3D 12 может быстро усложниться со всеми различными уровнями поддержки, для адаптеров UMA или дискретных (не UMA), а также со значительными различиями в архитектуре между адаптерами GPU.

Рекомендуемая стратегия для управления памятью Direct3D 12, описанная в этом разделе, — "классификация, бюджет и поток".

Типы ресурсов

Основная концепция "зафиксированного ресурса" (создание виртуальных и физических адресных пространств, инициализированных в управляемой физической памяти) была реализована еще с Direct3D 9, хотя виртуальные адреса (VA) и физические адресации могут быть разделены в Direct3D 12, чтобы приложение могли тщательно управлять физической памятью.

Помимо выделенных ресурсов, конструкция кучи Direct3D 12 включает два других типа ресурсов: "помещено" и "зарезервировано". В Direct3D 11 "зарезервированный" ресурс был известен как "ресурс с плиткой".

Зарезервированные ресурсы отличаются от размещенных ресурсов в том, что зарезервированные ресурсы имеют собственное уникальное виртуальное адресное пространство GPU. Это позволяет выделить большое пространство va в начале, а затем позволяет сопоставлять страницы va с определенными разделами кучи позже, а приложение перенастраивает расположение на лету. Пространство va является непрерывным и может быть сопоставлено с разреженно.

Зарезервированный ресурс можно сделать ссылочными регионами в куче с помощью вызовов API, таких как UpdateTileMappings , и их можно сделать резидентом приложения, обновляя таблицы страниц в режиме реального времени. Если диапазон va сопоставляется с нулевой или не резидентной кучей, эта часть ресурса считается не резидентной. Если диапазон va сопоставляется с постоянной кучей, эта часть ресурса считается резидентной. Кучи находятся при создании.

Размещенные ресурсы — это гораздо более простой макет, который является просто указателем на определенную область кучи (например, область 1 Мб для текстуры в куче 5 МБ). Барьеры псевдонимов позволяют использовать перекрывающиеся размещенные ресурсы (см. в разделах CreatePlacedResource и ResourceBarrier).

Зарезервированные ресурсы доступны не на всем оборудовании Direct3D 12, а размещенные ресурсы являются разумным резервным вариантом, хотя размещенные ресурсы должны быть непрерывными и не могут быть частично резидентными.

Бюджет памяти

В Direct3D 12 при выделении кучи вы создаете физический аспект памяти зафиксированного ресурса. Более явный выбор сегмента памяти доступен в Direct3D 12 (выбор между видео и системной памятью). Адаптеры UMA имеют только один сегмент памяти — системную память.

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

Api для бюджета памяти — QueryVideoMemoryInfo. Для дискретных адаптеров "локальный" — видеопамять, "нелокальный" — системная память. Для адаптеров UMA, не являющихся локальными, всегда равно нулю. Один из вопросов дизайна заключается в том, будет ли ваш двигатель управлять обоими бюджетами или только местным бюджетом. Управление только местным бюджетом проще, но имеет некоторые предостережения; Например, предположим, что есть максимальный местный бюджет в 1 Гб, то все кучи будут поступать из этого 1 Гб в системе UMA и нет переполнения системной памяти (очевидно, что нет).

Так как управляемая память Direct3D11 для приложений, неиспользуемые ресурсы по сути будут вытащиться.

Выберите наиболее подходящие измерения ресурсов. Определите, подходит ли размер ресурса для ситуации, в котором на самом деле выполняется приложение. Некоторые пользователи могут запускать приложение в окне или с разрешением экрана 800x600.

Стратегия классификации

Чтобы эффективно управлять ресурсами в сценариях с привязкой к памяти, рассмотрите возможность классификации ресурсов на следующие:

Классификация Примеры Объекты и функции API Примечания по управлению
Критически важно Пользовательский интерфейс игры Распределителем команд, очередями команд, кучами запросов, ресурсами и кучами ресурсов. Эти элементы должны находиться в нестраничной или постоянно зафиксированной памяти.
Масштабируемый или необязательный Модели и текстуры уровня, цепочки буферов, коробки с небом, модели персонажей от первого лица Ресурсы и кучи. Зафиксированные ресурсы, а также размещенные и зарезервированные ресурсы могут работать так же хорошо. Интегрируйте бюджет расположения памяти в алгоритмы отрисовки. Выберите соответствующий уровень доступных сведений и повторно оцените менее одного раза для каждого кадра. Методы включают использование ресурсов переменного размера и масштабирование цепочки буферов.
Повторно используемые ресурсы Теневые буферы, отложенные ресурсы отрисовки, ресурсы постобработки, кэши данных освещения Ресурсы и кучи. Перекрытие помещает ресурсы в кучу и барьеры псевдонимов. Повторно используйте большие ресурсы или области кучи в кадре, чтобы сократить требования ко всему кадру. Используйте метод повторного использования внутрикадровой памяти. В Direct3D 11 приложения могут повторно использовать ресурсы только с тем же типом и потенциально достаточно большими размерами. Кучи Direct3D 12 позволяют перекрывать ресурсы для гораздо более простого и большего повторного использования.
Ресурсы потоковой передачи Ландшафт, текстуры открытого мира и геометрия Ресурсы и кучи. Создание бесплатных потоков, фоновые потоки ЦП и очереди и списки команд копирования в фоновом режиме. Частичное расположение, обычно основанное на видимости (с помощью оценки представления или расстояния) и повторная оценка расположения требует каждого кадра.
Метод использования частичного управления местом расположения для каждой плитки и повторного использования между кадрами доступен, если адаптер GPU поддерживает зарезервированные ресурсы в кучах.
Используя метод повторного использования межкадровой памяти, можно выполнить частичное расположение подресурсов, но это менее оптимально. Размещенные ресурсы с кучами должны обеспечить более быструю утилизацию, но выделенные ресурсы можно использовать в качестве резервного.

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

Как правило, графические подсистемы Direct3D 12 должны учитывать более разнообразный и динамический бюджет и делать это более строго, чем в прошлом. Лучшие приложения будут находить все четыре категории в бюджете, заданном для процесса, масштабируя игровой процесс от фонового мобильного приложения до полноэкранных дискретных бюджетов. Но многие приложения, скорее всего, будут испытывать трудности, начиная с слишком большого количества критически важных типов ресурсов категорий. Direct3D 11 включил ресурсы для анонимного создания и получения критического состояния, не влияя на производительность. Однако для Direct3D 12 разработчики должны тщательно искать случайно созданные ресурсы в подсистеме и ПО промежуточного слоя и повторно назначать их одной из других категорий.

Другими проблемными областями являются компоненты ПО промежуточного слоя, пользовательские элементы управления и внутрикадровая потоковая передача. Компоненты ПО промежуточного слоя не могут быть подвержены бюджету и не должны работать тесно вместе. Компоненты ПО промежуточного слоя, скорее всего, могут предоставлять функции в качестве методов отрисовки; и приложение может полагаться на предоставление параметров ПО промежуточного слоя и подсистемы. Разработчики могут полагаться на Direct3D 11 для разбиения по страницам и достижения правильной частоты кадров. В некоторых случаях приложения Direct3D 11 могут разбиение содержимого ресурсов по страницам в каждом кадре; и это привело к приемлемой частоте кадров для пользователя. Большинство обработчиков передают данные ресурсов только в качестве фонового действия, где они не имеют корректного отката к высокоприоритетной внутрикадровой потоковой передаче. Попросите подсистемы реализовать, что подорвет некоторые затраты на ЦП, которые они ищут, перейдя на Direct3D 12. Разработчики движка могли бы рассмотреть возможность раздразнивать свои кадры на этапы, чтобы предоставить больше возможностей для повторного использования ресурсов; и, вероятно, работают с поставщиками ПО промежуточного слоя для поддержки размещенных ресурсов и кучи для повторного использования внутрикадровой памяти.

CreateCommittedResource

CreateReservedResource

Руководство по программированию для Direct3D 12

Управление памятью

Привязка ресурсов