Если коротко:
Размер исходника не показывает, сколько текстура займёт в памяти мобильной 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. Иначе изменение текстуры легко спутать с разрешением рендеринга, фильтрацией и оптикой.
Порядок проверки
- Зафиксируйте целевое устройство, тяжёлую сцену и текущую память текстур.
- Разделите карты по роли и задайте platform override, не уменьшая весь проект одним пресетом.
- Включите mipmaps для объектов, которые уходят вдаль, и отдельно проверьте UI.
- Настройте streaming pool по замеру, повторите маршрут и проверьте дозагрузки.
Если время кадра остаётся плохим, проверьте draw calls и границу CPU/GPU. Для общего замера Unity подойдёт порядок профилирования VR. Меняйте один параметр за тест, чтобы память и чёткость можно было сопоставить с конкретным изменением.
Проверка по шагам
Порядок проверки
Выполнено 0 из 4