Обычно, оптимизация сцены в 2D игре не нужна.
В данном случае, под оптимизацией понимается дозагрузка объектов, отключение объектов вне камеры и другие приемы, которые просто излишни на небольших сценах.
Но что делать, если нужна большая сцена? Например, 100 на 100 юнитов.
Большая, бесшовная сцена, поделенная на участки (лес, горы, деревня). Сразу скажу - на сцене нет объектов живущих своей жизнью, вне игрока (игрок ушел - все остановилось).
Огромное количество объектов на сцене вызовет нагрузку на процессор, видеоадаптер, упадет фпс, появятся лаги.
Что я пробовал:
1. Отключать части сцены вне камеры. Например, когда игрок в лесу, отключать деревню (место, где его сейчас нет).
А когда игрок подходит к деревне - включать деревню.
Результат - "зависание" т.к. на загрузку нужно время. Разумеется, можно это было оформить в виде таблички - идет загрузка, но тогда это не бесшовный мир (да и проще поделить 1 большую сцену на несколько маленьких).
2. Индивидуально отключать объекты вне камеры. Проще говоря если игрок не видит куст - отключаем объект, когда игрок уже близко к кусту - включаем объект. Но это сложно реализуемо т.к. отключенный объект не может включить сам себя (из Disable стать Enable) и нужен ещё один объект, который это будет делать.
В общем большая сцена тормозит т.к. на ней много объектов (что очевидно).
Делаем дозагрузку локации - получаем зависание на 5 секунд.
Делаем дозагрузку объекта получаем зависание на 0.1 секунды (приблизительно) и кучу работы.
Как бы вы оптимизировали большую сцену в 2D игре? Есть идеи?
Когда объекты крупные в сцене то пользователь видит их скорость кадров. Можно ставить 60 fps.
Когда пользователь смотрит на объекты размером с пиксель - то и не нужно их обновлять часто.
Сделай хоть 10-15 fps и будет норм.
Ну тоесть я как-бы взял level of detalization но применительно не к пространству а ко времени.
freeExec У меня нет объектов размером с пиксель. Типичный размер объекта 150x150 пикселей.
Обычная картинка, которую я перетащил на сцену и сделал из неё префаб. У префаба указал - статик т.к. эта картинка просто будет стоять на сцене - дерево, например. Всё как в типовой 2D игре.
Но при куче таких картинок, сильно проседает фпс. Как писали ниже в комментарии - сцена 100 на 100 юнитов - это не много. Что то не оптимизировано или я делаю не так.
Никаких скриптов у картинок нет.
Евгений Иванов, не знаю чел. Ничего не могу сказать. Вот те кто пишут что 100х100 это не много
- пускай сделают proof. Приложение на 10 строчек которое двигает эти 10 тыщ юнитов
и транслирует стабильный fps. И после этого можно пойти шаг-за шагом и сличать различия
между эталоном и твоим кодом.
mayton2019, мудрый филин, если ты не разработчик игр или не разработчик на юнити и не знаешь работают ли твои идеи, то может не нужно давать советы в той области, в которой ты не разбираешься?
Движение 10000 юнитов находится в самом низу, занимает 5 строчек кода.
Скрин из профайлера в эдиторе.
Как можешь видеть, движение 10000 юнитов занимает 0.05ms
Рендер занимает 7ms и он занимает так много времени из-за конвертации float3 в vector3, если делать умнее и конвертировать только матрицу, а не отдельно позицию, вращение и скейл, времени оно занимать будет меньше.
При этом я никак не фильтрую сущности, отрисовываются абсолютно все 10000
И это метрики из эдитора.
Разделить мир на ячейки, обновлять и отрисовывать только те сущности, которые находятся от игрока на определенном радиусе. Не знаю что там тебе и откуда нужно подгружать, 100 на 100 юнитов это небольшая сцена, все ее содержимое спокойно будет помещаться в оперативной памяти, с диска там ничего подгружать не нужно. Гугли spatial hashing, выбирай алгоритм, который тебе лучше подходит
K0TlK С диска ничего не грузится.
Есть самая обычная сцена 100 на 100 юнитов (2D игра). На сцене расположены "объекты - картинки", деревья, дома. Есть и объекты с анимацией - крутящиеся монеты и т.д.
Сцена условно поделена на локации (лес, горы, деревня).
Если оставить только лес (удалить горы и деревню) то фпс будет 240.
Если оставить лес и горы - фпс 200.
Чем больше объектов - тем значительнее ниже фпс. Вы писали, что сцена небольшая, но фпс при добавлении новой локации проседает.
Никаких скриптов нет. Просто добавляем картинки, причем небольшие - 300x300 пикселей. Дом, дерево и т.д. Всё префабы, всё статик, никаких коллайдеров и т.д. - это фоновые картинки, префабы с image.
А фпс проседает. (
Евгений Иванов, проседает потому что их юнитевский батчинг обрабатывает и отправляет на отрисовку даже ту геометрию, что не попадает в камеру. если нужно отрисовывать и обрабатывать только то, что находится на определенной дистанции от персонажа или попадает в камеру, делай свой батчинг и отрисовывай спрайты сам через rendermesh/rendermeshinstanced/rendermeshindirect