Если коротко:

Размер исходника не показывает, сколько текстура займёт в памяти мобильной VR-гарнитуры. Настройте platform override и аппаратно поддерживаемое сжатие, добавьте mipmaps для 3D-объектов и включайте streaming только после замера сцены. Чёткость оценивайте по texel density и реальному размеру объекта в кадре.

Mobile VR texture optimization начинается с целевой гарнитуры и замера сборки. Правило «все текстуры только 1K» не учитывает размер объекта в кадре, UV-развёртку и тип карты. Две картинки 2048 × 2048 могут давать разную детализацию и занимать разный объём памяти.

Исходник, импорт и память GPU

PNG или TGA в проекте служит исходником. После импорта движок может уменьшить разрешение и перекодировать ресурс в формат, который GPU сэмплирует без полной распаковки. Поэтому вес файла на диске не равен объёму ресурса в графической памяти.

Для проверки порядка величин посчитайте несжатый вариант. RGBA-карта 2048 × 2048 по четыре байта на пиксель требует 16 MiB для верхнего уровня. Полная mip-цепочка добавляет около трети, потому что каждый уровень вдвое меньше по каждой оси. Для ASTC итог зависит от размера блока.

В Unity проверьте Max Size, platform override и формат в Texture Import Settings. Для Quest Meta указывает аппаратно поддерживаемые ETC и ASTC. Выбор блока ASTC меняет соотношение чёткости и памяти, поэтому его проверяют на normal map, цвете и масках отдельно.

Зачем mipmaps в VR

Mip-цепочка хранит уменьшенные версии исходной карты. При удалении объекта GPU берёт более низкий mip, что снижает мерцание мелких деталей и нагрузку на фильтрацию. Цепочка сама занимает память. Отключать mipmaps ради экономии разумно только для ресурсов, которые не уменьшаются на экране, например для части UI. Решение нужно проверить в сборке.

Потоковая загрузка и бюджет

Streaming не сжимает саму текстуру. Он держит в памяти те mip-уровни, которые нужны камере. При малом memory budget движок выберет меньший mip; игрок может увидеть мыльную карту или её дозагрузку. Слишком большой бюджет оставит меньше памяти для render targets, meshes и других ресурсов.

В Unity сопоставляйте desiredTextureMemory, targetTextureMemory и currentTextureMemory. В Unreal Engine смотрите STAT STREAMING, Required Pool и визуализацию Required Texture Resolution. Это покажет, не теряет ли карта деталь из-за бюджета или неточных streaming data.

Texel density определяет нужную чёткость

Texel density связывает площадь полигона в UV с его размером в мире. Мелкий предмет у лица может требовать больше текселей на метр, чем стена вдали. Слабая UV-развёртка способна растратить 4K, а ровная плотность иногда позволяет снизить Max Size без заметной потери.

Сравнивайте текстуры в шлеме с одинаковой дистанции, светом и render scale. Иначе изменение текстуры легко спутать с разрешением рендеринга, фильтрацией и оптикой.

Порядок проверки

  1. Зафиксируйте целевое устройство, тяжёлую сцену и текущую память текстур.
  2. Разделите карты по роли и задайте platform override, не уменьшая весь проект одним пресетом.
  3. Включите mipmaps для объектов, которые уходят вдаль, и отдельно проверьте UI.
  4. Настройте streaming pool по замеру, повторите маршрут и проверьте дозагрузки.

Если время кадра остаётся плохим, проверьте draw calls и границу CPU/GPU. Для общего замера Unity подойдёт порядок профилирования VR. Меняйте один параметр за тест, чтобы память и чёткость можно было сопоставить с конкретным изменением.

Проверка по шагам

Порядок проверки

Выполнено 0 из 4

0 из 4
Поделиться:TelegramВКонтакте

Источники

  1. Unity 6: Texture Import Settings
  2. Unity 6: Mipmap Streaming
  3. Unreal Engine: Texture Streaming Overview
  4. Meta: Getting a Handle on Meta Quest Memory Usage