Плавная асинхронная загрузка сцен и текстур — Unity и GearVR

У меня есть две основные проблемы с Unity (5.3.4p1) на GearVR с Samsung S6:

1) Асинхронная загрузка сцены. Есть ли какое-либо изменение, позволяющее загрузить новую сцену в фоновом режиме, не видя небольших зависаний? Сцена имеет ~60k треугольников и использует пару текстур 4k и ~10 других текстур 2k. Когда эта сцена загружается, происходит несколько коротких замираний. Я знаю, что могу избежать этого, затухая до черного цвета, а затем запуская уровень загрузки. Но это занимает ~ 10 секунд, и пользователь может быть сбит с толку, видя черный экран в течение такого длительного времени с включенной гарнитурой VR.

2) Создание текстур из изображений, загруженных с помощью класса WWW. Я использую изображение 360 4k, отображаемое на куполе в другой сцене. Когда я пытаюсь загрузить текстуру (4k, PNG или JPG) во время выполнения, это делается асинхронно. Но Unity зависает на 2-3 секунды, когда я использую:

Texture2D myTexture = www.texture;

Есть ли какой-либо способ избежать этого, кроме использования загруженных байтов и распаковки JPG или PNG с использованием алгоритма, отличного от Unity, на фоне, а затем загрузки созданных значений rgb в новую текстуру? Хороший пример плавной загрузки текстур можно увидеть в приложении Flickr VR, но я сомневаюсь, что они использовали Unity для создания этого приложения.

Эти две проблемы возникают и на Oculus Rift, но они менее заметны из-за более высокой производительности ПК.

Как правило, я хочу добиться плавной загрузки в Gear VR с помощью Unity. Это как-то возможно?


person jakub.sz    schedule 12.04.2016    source источник


Ответы (1)


Этот вопрос должен был быть опубликован как два отдельных вопроса, но все же:

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

AD 2: устройства Android не могут отображать файлы в формате jpeg или png. Их приходится распаковывать в очень большие несжатые текстуры, снова загружать в память и только потом рендерить. Это требует много оперативной памяти и времени.

Что вы можете сделать, так это иметь текстуры в собственном формате DXT или ETC и загружать их как текстуры самостоятельно. У меня была такая же проблема, и это ускорило загрузку моих текстур почти в 10 раз. Они также используют меньше памяти.

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

person Krzysztof Bociurko    schedule 12.04.2016
comment
объявление 1: Я делаю это так, но все еще есть много небольших зависаний при загрузке сцены, и она немного прыгает. объявление 2: графический процессор Samsung S6 не поддерживает DXT (ранее тестировал его), но сейчас я попытался сделать это с текстурой ASTC. Проблема в том, что игра зависает на 3-5 секунд, когда я применяю байты текстуры. Я делаю это так: byte[] bytes = www.bytes; tex.LoadRawTextureData(bytes); tex.Apply(false, false); - person jakub.sz; 12.04.2016
comment
Как я могу этого избежать? Есть ли другой способ загрузить изображение и загрузить его в текстуру Unity? - person jakub.sz; 12.04.2016
comment
Это должно работать, но я никогда не делал этого с текстурами ASTC. Возможно, происходит какое-то преобразование во время выполнения? Попробуйте ETC1, они ограничены, но должны работать на каждом устройстве Android без дополнительной обработки. Также может помочь установка для второго аргумента tex.Apply (makeNoLongerReadable) значения true. Что касается моего примера с ускорением в 10 раз, это было на больших наборах текстур 2048x2048 и 1024x1024, загруженных по одной на кадр, на Samsung Galaxy S II. Конечно, это заняло некоторое время, но некоторые текстуры загружались меньше секунды. - person Krzysztof Bociurko; 13.04.2016
comment
А по поводу других способов - есть assetsbundles, может они будут работать лучше? - person Krzysztof Bociurko; 13.04.2016
comment
Большое спасибо :) Мне удалось заставить это работать, и теперь это действительно быстро. Я использовал ASTC (блоки 6x6 и режим быстрого сжатия). Есть ли способ найти ширину и высоту текстуры из загруженных данных или мне следует использовать другой (текстовый) файл с сохраненными свойствами? Мне все еще нужно выяснить, как быстрее загрузить огромную сцену, но по крайней мере одна проблема устранена. - person jakub.sz; 13.04.2016
comment
С PVRTC и DXT я просто проанализировал заголовочный файл, это была простая структура. С ASTC заголовок находится в этом документе, скопируйте их в структуру C# и используйте методы Marshal.* для копирования данных из него. Кстати, мне, вероятно, нужно выложить эти загрузчики текстур на github или что-то в этом роде, это не первый раз, когда кто-то спрашивает о подобных вещах. - person Krzysztof Bociurko; 13.04.2016
comment
Спасибо большое! Это было действительно полезно :) Я также исправил долгую загрузку сцены, оставив сжатие Auto ASTC Unity и вручную установив 6x6 40% для всех необходимых текстур. Кроме того, после уменьшения разрешения для некоторых из них сцена загружается в 10-15 раз быстрее, чем раньше :D - person jakub.sz; 13.04.2016
comment
Для следующего человека, столкнувшегося с этим: у меня были проблемы с отображением при загрузке файлов astc, созданных astcenc. Вы должны пропустить байты заголовка при использовании LoadRawTextureData. Заголовок имеет длину 16 байт, поэтому создайте новый массив байтов, который не включает первые 16 байтов www.bytes. - person Jens Zalzala; 07.02.2018