Нагрузка Префабов на Сцену. Unity3d
Есть сцена, для этой сцены есть 50 уровней, загруженных в префабы. Эти префабы закинуты в главный скрипт сцены, который висит на камере. При заргрузке сцены появляется определённый уровень через Instantiate. У меня происходит зависание игры через 10-15 мин после её начала на телефоне, падает фпс, и просто сильно неимоверно всё залагивает.
Верно ли я понимаю, что при каждой загрузке сцены, эти 50 префабов также подгружаются каждый раз, т.к. они упомянуты в скрипте, который висит на объекте сцены? И это каждый раз нагружает сильно игру? Если да, то как верно в этом случае загружать уровень на сцену?
Ответы (2 шт):
Судя по падению фпс, эти префабы действительно могут прогружаться при загрузке сцены, так как они проинициализированы в инспекторе. Точно сказать не могу, не нашел какой-то информации, но вообще это логично.
Чтобы избежать этого попробуйте положить префабы в папку Resources, пронумеровав так, чтобы можно было провести конкретную нуменклатуру. Если это уровни, это может быть Level_1, Level_2, Level_3... Вы можете в рантайме загружать файлы, лежащие в папке Resources: https://docs.unity3d.com/ScriptReference/Resources.Load.html
int levelIndex = 2;
GameObject prefab = Resources.Load<GameObject>("Level_" + levelIndex);
Instantiate(prefab, ...);
Вы также можете рассмотреть вариант хранения уровней в виде, например, json-файлов и строить их "на месте" при загрузке уровня.
Если при загрузке уровня все же происходят задержки, то стоит сделать прогресс бар или вроде того.
если следовать простому подходу "1 сцена = 1 уровень" такой проблемы возникать не должно в принципе.
А дальше по мере необходимости асинхронно загружаешь другую сцену с экраном загрузки(или вообще без него!) и никаких проблем быть не должно.
А загружать уровень из префаба полностью звучит совсем не оптимально. Плюс неясно дестроишь ли ты обьект старого уровня.
Так же неясно что такое уровень. Может это пара легких обьектов, а может это огроменный тяжелейший набор обьектов занимающий половину оперативки.
Теперь по поводу тормозов - тормоза начинаются через 15 минут времени. Что бы я не предположил - очень высока вероятность ошибится. Это может быть мемори лик, например. Или перегрев телефона + тротлинг из-за неоптимально написанного кода. Или еще что.
Это необходимо выяснять через использование профайлера и никак иначе.
Не нужно гадать на кофейной гуще. Нужно сесть и посмотреть в чем конкретно проблема.