Отчетность по метрикам потоковой передачи текстуры в Unreal Engine 4

0
2
Отчетность по метрикам потоковой передачи текстуры в Unreal Engine 4

Начиная с версии 4.15, вы можете профилировать статистику потоков текстур с помощью команды консоли STAT STREAMING. Это сообщает о производительности, использовании памяти и других показателях, используемых текстурным стримером.

STAT STREAMING sortby=name maxhistoryframes=1

Начать Потоковую Передачу UE4

При чтении данных памяти термин «пул» относится к концептуальной (зарезервированной) памяти и не относится к фактической памяти. Слово «mips» сопоставляется с памятью, используемой в настоящее время текстурами, а не ожидаемым или будущим использованием. Метрики памяти классифицируются в трех основных пулах:

  • Текстура
  • Потоковая передача
  • Wanted (требуется)
Эти размеры пула указаны справа от каждой строки в категории Memory Counters (Счётчики Памяти).
StatОписание
Cycle Counters (Счетчики циклов)
Game Thread Update Time (Время обновления игровой темы)Время, затрачиваемое функцией обновления стримера. Это объясняет большую часть работы потоковой передачи текстур. За пределами стримера текстуры обрабатывается всего несколько задач, например удаление ссылки на текстуру, компонент или уровень. Во время обновления игрового потока стример выполняет один шаг к полному обновлению. Полное обновление занимает несколько кадров и относится к r.Streaming.FramesForFullUpdate. Существуют различные этапы обновления, определенные в разделе Counter (Счетчик) статистики.
Memory Counters (Счетчики памяти)
Texture Pool (пул текстур)Общая память доступна для текстурных ресурсов. Это включает в себя не потоковые ресурсы, такие как объекты рендеринга, буферы частиц графического процессора, кубические карты, текстуры пользовательского интерфейса и текстуры без потоковой передачи. На некоторых платформах эта память может использоваться для хранения неструктурных ресурсов, таких как Static Meshes.  Texture Pool примерно равен Safety Pool + Temporary Pool + Streaming Pool + NonStreaming Mips (только сумма колебаний, если таковая имеется, до размера пула безопасности).
Safety Pool (безопасный пул)Это значение задается в файле конфигурации Engine
под [TextureStreaming] как MemoryMargin.
 Это память, зарезервированная для неожиданных (не потоковых) распределений. Если доступная память колеблется циклически на величину под этим значением, стример текстуры стабилизирует свой потоковый пул до максимума, принимаемого этим колебанием. Если нормальное (ожидаемое) колебание занимает больше, чем размер пула безопасности, то стример текстуры будет постоянно адаптировать свой бюджет, возможно, создавая бесконечные циклы потоковых текстур внутри и снаружи.
Temporary Pool (временный пул)Это значение управляется r.Streaming.MaxTempMemoryAllowed и определяет, сколько дополнительной памяти разрешено использовать стримеру при изменении размера текстур. При изменении количества копий текстуры, движок должен создать новую текстуру, меньшую или большую, которая будет содержать будущие данные mip. Это косвенно контролирует количество запросов при освещении, поскольку стример отправляет в систему ввода – вывода столько запросов, сколько позволяет временный пул.

Обратите внимание, что временный пул должен быть не меньше, чем самый большой ресурс для потока, но слишком большой объем памяти будет потерян (поскольку он зарезервирован для этой цели). С другой стороны, слишком маленькая установка может замедлить скорость потока передачи (не создавая достаточную работу для системы ввода – вывода, делая ее бездействующей). Обратите также внимание на то, что стример имеет очень мало контроля над порядком обработки в запросах потоковой передачи. Это означает, что использование относительно небольшого временного пула дает лучший контроль над тем, что было загружено первым.
Streaming Pool (пул потоковой передачи)Объем памяти, доступный для стримера текстуры. Обычно стример берет всю свою доступную память для того, чтобы либо передавать потоком новые mips, либо как можно дольше хранить ранее mips потоковой передачи в памяти. Пул потоковой передачи содержит Видимые mips, Скрытые mips, Принудительные mips и Кэшированные Mips.  Streaming Pool приблизительно равен Visible Mips* + Hidden Mips + Forced Mips + Cached Mips (*: при использовании в полном объеме, в противном случае необходимо использовать незанятое пространство).
NonStreaming Mips (Mips непотоковой передачи)Объем памяти, используемой не потоковыми размещениями. Если значения этих распределений регулярно колеблются до значений больше, чем значение пула безопасности, это будет влиять на бюджет пула потоковой передачи, и его следует избегать (путем уменьшения распределения или увеличения пула безопасности).
Required Pool (требуемый пул)Количество данных mip, которые необходимо загрузить текстурному стримеру в соответствии с его метрикой. Это может превышать 100% пула потоков текстур, и в этом случае будет сделан некоторый компромисс, а некоторые из текстур (ы) не будут загружены в требуемое разрешение.
Visible Mips (видимые Mips)Требуемая память в настоящее время воспринимается видимыми текстурами. Это не включает принудительных mips.
Hidden Mips (скрытые Mips)Требуемая память в настоящее время используется невидимыми текстурами. Это не включает вынужденные mips. Чтобы предотвратить просмотр текстур с низким разрешением при первом отображении текстуры, стример предварительно создает текстуры заранее и обычно с количеством mip на один меньше, чем требуется (см r.Streaming.HiddenPrimitiveScale).
Forced Mips (принудительные Mips)Требуемая память в настоящее время воспринимается текстурами, которые принудительно загружены. Текстуры обычно принудительно внедряются через механизмы геймплея в течение небольшого периода времени. Это не включает текстуры, которые помечены как текстуры, не связанные с потоковой передачей.
Cached Mips (кэшированные Mips)Память, взятая mips текстуры, которые больше не нужны. Они будут храниться в кэше, если их память не понадобится другим нужным mips.
Wanted Pool (требуемый пул)Часть требуемого пула, который в конечном итоге будет передан в потоковой передаче.
Wanted Mips (требуемые Mips)Какая часть запрашиваемого пула фактически транслируется. Как только он достигает 100%, стример прекращает отправку запросов ввода – вывода для загрузки новых mips. Wanted Mips* равен Visible Mips + Hidden Mips + Forced Mips **
Inflight Requests (запросы Inflight )Сколько памяти еще предстоит обработать IO. Когда значение 0, все предыдущие запросы обрабатываются во время создания новых запросов. Если это происходит, когда стример передает контент потоковой передачи, это будет признаком того, что стример не использует всю доступную пропускную способность. Пропускная способность может быть увеличена за счет увеличения r.Streaming.MaxTempMemoryAllowed (за счет большего количества потерянной памяти и меньшего контроля порядка загрузки) или путем уменьшения r.Streaming.FramesForFullUpdate (за счет более длительного времени обновления).
IO Bandwidth (Полоса пропускания IO)Размер загруженных mips завершен с момента последнего обновления, разделенный на время с момента последнего обновления. Это не точное измерение пропускной способности IO, но все равно это можно использовать, чтобы понять, насколько быстро система загружает запросы.
Counters (счетчики)
Setup Async Task (Настройка Async Task)Время, затраченное на подготовку данных для задачи асинхронного стримера. Он работает как первый шаг полного цикла обновления.
Update Streaming Data (Обновление данных потоковой передачи)Это время, используемое для постепенного обновления данных потоковой передачи. Это включает обновление видимости, обновление состояния текстур, обновление границ любых используемых динамических компонентов. Шаг будет запускать несколько кадров в строке, как определено r.Streaming.FramesForFullUpdate.
Streaming Texture (потоковая передача текстуры)Время, затраченное на подготовку и отправку запросов на загрузку и отмену.

Пошаговая обработка новых уровней загрузки

Начиная с Unreal Engine 4.15, стример текстуры обрабатывает данные уровня постепенно, всего лишь немного в каждом кадре, между временем их загрузки и моментом, когда они становятся видимыми. Раньше эта обработка происходила бы в кадре, когда уровень становился видимым и при этом мог генерировать некоторые заметные помехи.

Объем обработки каждым фреймом, контролируется r.Streaming.NumStaticComponentsProcessedPerFrameкоторый имеет значение по умолчанию 50. Установка этого значения на 0 отключит пошаговую работу, и это приведет к тому, что система будет вести себя так же, как и до 4.15.

Важно отметить, что обработка пошагового уровня будет применяться только к компонентам с их мобильностью, установленными в Static. Подвижные компоненты всегда обрабатывались постепенно в тике движка.

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

Вы можете исследовать пошаговую обработку, выполнив команду консоли:


Stat Streaming SortBy=name

Стоимость включена в категорию Обновление данных потоковой передачи.

Представление

С улучшением текстурного стримера в 4.15, следующие информационные списки описывают целевые улучшения с некоторыми конкретными метриками о том, как все было улучшено.

Уменьшение количества текстур, полученных с помощью Стримера Текстуры

Это улучшилось благодаря обработке видимости на каждом компоненте. Текстуры, которые используются невидимыми и скрытыми компонентами, передаются с mips (на один меньше по количеству) в качестве предварительной выборки. Добавление данных потоковой передачи текстур материала также помогло правильно вычислить масштаб, применяемый к UV-каналам, для таких вещей, как подробные карты.

Наконец, другие улучшения здесь были получены из вычислительных (меньших) границ для материалов для статик геометрии.

Метрики ниже были взяты из Paragon, используя три разных точки обозрения вокруг уровня.

Required Texture Pool / Требуемый пул текстур
ДоПосле
Количество видимых
Запуск678 Мб564 Мб370 Мб
Боковая дорожка карты796 Мб597 Мб308 Мб
Средняя дорожка карты1086 Мб674 Мб271 Мб

Сокращение времени Видимых Текстур для потоковой передачи

Чтобы уменьшить количество времени, которое требуется для потоковой передачи в видимых текстурах (кроме уменьшения глобального бюджета текстур); стример содержит таблицу видимых mips и бюджетных mips. Сохраняя следы видимых mips из тех, которые предусмотрены в бюджете, стример способен передавать заметные данные до потоковой передачи данных предварительной загрузки и принудительной загрузки.

Метрики ниже были взяты из Paragon, используя три разных точки обозрения вокруг уровня.

Загрузка видимых MIPsДоПосле
Запуск20 сек.10 сек.
Боковая дорожка карты19 сек.9 сек.
Средняя дорожка карты20 сек.6 сек.

Сокращение времени работы CPU, потребляемого Стримером

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

В приведенном ниже примере показано улучшение наихудшего кадра обновления из Paragon.

Стоимость обновления игрового потокаДоПосле
Худший обновляемый фрейм1.1 мс0.6 мс

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

Стоимость загружаемого уровня игрового потокаДоПосле
Пошаговое обновление150 мс3 мс

Устранение низкого качества и плохого режима

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

Кроме того, теперь существует более широкая поддержка потоковой текстуры от компонента, включая Системы Частиц и Отдельных Мешей. Это устраняет другие проблемы с низким разрешением и иногда еще и высокое потребление памяти.

Устранение ручных настроек для разных бюджетов памяти

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

Будет затронуто только наименьшее количество текстур, и эффект будет локализован, так что в разных местах убытки не будут одинаковыми.