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


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

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

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

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

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

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

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

Зарезервированный ресурс можно сделать для ссылки на регионы в куче с вызовами API, такими как UpdateTileMappings, и их можно сделать резидентом приложения, обновляя таблицы страниц в лету. При сопоставлении диапазона va с NULL или кучи, которая не является резидентной, эта часть ресурса считается резидентной. Если диапазон 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 позволяют перекрывать ресурсы для более простого и большего использования.
Потоковая передача ресурсов Ландшафт, текстуры открытого мира и геометрии Ресурсы и куча. Создание свободного потока, фоновые потоки ЦП и очереди команд фонового копирования и списки. Частичное место проживания, обычно основанное на видимости (с помощью представления-frustum или оценки расстояния) и повторное вычисление расположения нуждается в каждом кадре.
Метод использования частичного размещения на плитке и повторного использования между кадрами доступен, когда адаптер GPU поддерживает зарезервированные ресурсы в кучах.
Используя метод повторного использования памяти между кадрами, можно выполнить частичное размещение подресурсов, но является менее оптимальным. Размещенные ресурсы с кучами должны обеспечить более быструю переработку, но выделенные ресурсы можно использовать в качестве резервной копии.

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

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

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

CreateCommittedResource

CreateReservedResource

руководство по программированию direct3D 12

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

привязки ресурсов