Unity - Texture2D.Loadimage, приводящий к MemoryWarning
В настоящее время я работаю над 2D-проектом для Unity (для мобильных телефонов / планшетов), где я загружаю несколько тяжелых картинок, используя UnityWebRequestTexture.GetTexture(url)
, который я затем храню с помощью File.WriteAllBytes(filePath, webRequest.downloadHandler.data)
,
Позже в проекте мне нужно показать загруженную картинку в элементе RawImage. Чтобы избежать блокировки приложения, я читаю байты через FileStream в отдельном потоке, который работает хорошо.
Но когда я звоню (из основного потока) ((Texture2D) myRawImage.texture).LoadImage(loadedBytes)
Мой Профилировщик показывает огромный пик, и если большинство устройств справляются с этим правильно, на iPad Mini я часто получаю предупреждение о предупреждении в этот момент. Что, при повторении, приводит к тому, что приложение принудительно закрывается iOS.
Для информации размер загружаемого изображения зависит от запрашивающего его устройства. Изначально мы намеревались отображать картинки 2048x1536 таким образом на iPad Mini, но на каждом дисплее у нас появлялось предупреждение о состоянии памяти. Сейчас мы используем 750x1334, но время от времени получаем MemoryWarning.
Мой вопрос: есть ли лучший способ сделать шаг "LoadImage"? Я считаю, что преобразование из byte[]
в Texture2D
вот где моя проблема с памятью, но я не нашел обходного пути к этому.
Или в конечном итоге: есть ли лучший способ загрузить / сохранить изображение? Если изображение было в ресурсах приложения с самого начала, у меня нет проблем с отображением его на том же устройстве. Может быть, есть способ загрузить текстуру, применяя тот же алгоритм сжатия, который получают ресурсы при создании приложения?
1 ответ
С использованием
Texture2D.Compress()
после загрузки текстура сжимает текстуру не менее чем на 90%.