Unity3d загружает спрайт-лист из Интернета и проблема с памятью

Я делаю приложение для интерактивной книги, в котором игрок будет сворачивать страницы и видеть анимацию спрайтов на странице. Я пытался загружать спрайты отдельно (300 изображений размером 512x512). Но когда я попробовал этот метод, iPad вылетает и говорит о проблеме с памятью. Я проверил профиль памяти на Unity, и приложение загружало «1,2 ГБ» в оперативную память. Он такой огромный, что iPad прав.

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

Второе, о чем я думаю прямо сейчас, скажем, у меня есть 30 кадров для 1 анимации спрайта, я просто помещаю 30 кадров в текстуру и использую только эту текстуру для анимации спрайтов. Я имею в виду, что вместо использования 30 разных изображений мне нужно использовать 1 текстуру атласа спрайта, которая содержит все кадры, и я могу изменить прямоугольник во время выполнения, чтобы представить анимацию спрайта. Но я не знаю, как я могу использовать только 1 текстуру для представления 30 кадров?


person Ali Avcı    schedule 14.08.2018    source источник


Ответы (1)


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

Предполагая, что это линейная установка, вы можете просто хранить плюс-минус 5 страниц за раз. Если я нахожусь на странице 1, загружаю страницы 2-6, когда я переворачиваю страницу, загружаю страницу 7. когда я перехожу на страницу 6, удаляю страницу 1. Будет компромисс между производительностью и распределением памяти, поэтому вы должны сделать вызов, сколько страниц кешировать.

Но я не знаю, как я могу использовать только 1 текстуру для представления 30 кадров?

Я не уверен, как у вас настроена текстура спрайта, но вы можете сделать спрайт из нескольких спрайтов, установив spriteImportMode в SpriteImportMode.Multiple. Затем вы можете определить границы каждого спрайта через родительские спрайты spriteMetaData. Вы также можете изменить это в редакторе единства, но из того, что вы описываете, вам придется делать это программно.

Я почти уверен, что это не идеальный путь. Вы можете заглянуть в Unity Tilemaps, чтобы найти более надежный ответ.

person T.J. Moats    schedule 14.08.2018
comment
Как вы справляетесь с нагрузкой? Можете ли вы привести несколько примеров кода? - person T.J. Moats; 15.08.2018