Войти
UnityФорумОбщее

Просадка FPS

#0
(Правка: 12:29) 12:29, 8 июня 2022

Добрый день, начал изучать Unity, в качестве обучения и прототипирования использую ассеты "Vampire survivors", потом хотел бы сделать схожую игру.
Накодил смотря на разные туториалы управление, врагов, и одну способность для героя. Более менее все работает, просадок нет, но если враги кучкуются и превращаются в что-то схожее со слизью gish, то начинается просадка, а если проникнуть туда внутрь героем, fps падает до 3-4. Тут врагов 700.
Кому не сложно посмотрите, это у всех так? Или у меня железо не тянет, "Vampire survivors" тоже лагает, но не так сильно и только под конец в полном фарше врагов и прокачанных способностей.
https://drive.google.com/drive/folders/1sieV-U64Elen-qNh63awLvp5EGLrvPr-

#1
1:53, 9 июня 2022

Открывай профайлер и смотри что грузит.
С 99% вероятностью код говнище, с типичными туториалами "используйте Gameobject.Find 700 раз"

#2
(Правка: 10:34) 10:32, 9 июня 2022

Ну код говнище это да, но просадка не в коде если посмотреть профайлер. Там Physics2d.Simulate -> Physics2d.Step это то, что сажает FPS больше всего, внутри него кажется методы связанные с коллизиями. Как я понял, когда вражины кучкуются, то плодят кучу коллизий между собой, толкаются и наглухо просаживают игру, просто кучка 2d спрайтов с rigidbody и collider движутся к своей цели и все, печально.
Профайлер | Просадка FPS

#3
(Правка: 20:27) 20:27, 9 июня 2022

Rigidbody на каждом ненужен, коллидер с is trigger нужен и raycast, и настроеная матрица коллизий в настройках

#4
6:17, 10 июня 2022

sinoby
> Rigidbody на каждом ненужен
А полу провалы в другие коллайдеры и проскоки между плотно стоящими объектами без ригибади не будут?

#5
10:41, 10 июня 2022

Без ригидбоди и стандартного коллайдера? Как рейкаст тут помогает? Тогда же все в один квадрат в друг друга провалятся.

#6
12:14, 10 июня 2022

Ах я думал тебе ригидбоди нужен только для определение попадания в тело врага, потому как упомянул Vampire survivors где враги слипались в кучу.
В любом случае для "не слипания" врагов в кучу ригид не лучшая идея когда их сотни, сделай сетку под ними в клеточку и пусть каждый занимает только свободную, но тут уже надо покодить нежели просто двигать врагов к игроку

если всеже ригид хочется то как вариант настроить физику в юнити на самую неточную и производительную

#7
15:20, 10 июня 2022

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

#8
(Правка: 3:18) 0:36, 12 июня 2022

Guest_John
Такая проблема явно не в самой физике, а в реализации.
Нужно смотреть физическое ли у тебя движение, и что в OnCollisionEnter/Exit?

Тут 2000 противников:
Изображение

#9
14:32, 12 июня 2022

Samaritan
Хорошая наводка, у меня враги двигались через transform.position = Vector2.MoveTowards
Сейчас передвижение изменил rigidbody.MovePosition, и на 700 врагов стал легко справляться без просадок, не знал что такая разница в производительности между ними.
Но начиная с 1600 врагов в скоплении начинает сильно просаживаться.
OnCollisionEnter/Exit только у игрока для фиксации урона по себе

#10
15:28, 12 июня 2022

Guest_John
> не знал что такая разница в производительности между ними
Разница производительности не в самом движении, а в том что в результате происходит. Не физическое движение - это принудительная телепортация. Если при физическом движении движок понимает, что будет столкновение, то ограничивает перемещение объекта, а не физическое насильно запихивает один объект в другой, после чего физический движок начинает думать, как это исправить.
Твоя ситуация осложнялась тем, что у тебя происходила телепортация очень большого числа объектов в одну точку, т.е. единовременный конфликт всех со всеми.

> Но начиная с 1600 врагов в скоплении начинает сильно просаживаться.
Больше чем в два раза подняли лимит - круто же! Или аппетиты растут?  =)

#11
16:42, 12 июня 2022

Samaritan
> не физическое насильно запихивает один объект в другой
Логично, можно было додуматься, но в начале посмотрев в каком то туториале про MoveTowards принял за самое правильное решение, поэтому даже не задумывался об этом.
Но пока думал над другими вариантами, пришел к совершенно другому решению

> Больше чем в два раза подняли лимит - круто же! Или аппетиты растут?
1600 врагов круто, и наверно более чем достаточно, но когда во все стороны будут летать 6 разных способностей, как в "Vampire survivors", они тоже сожрут много производительности, а меньше 1000 врагов это уже не так круто.

Пока искал про производительность в unity наткнулся на ECS архитектуру. Сейчас пытаюсь перенести на это, как я рассчитываю сам факт перевода на ECS уже увеличит производительность в 2 раза, еще там вроде довольно легко реализовать многопоточность, что еще в несколько раз увеличит производительность.

#12
16:51, 12 июня 2022

Guest_John
Да, как раз хотел посоветовать присмотреться к DOTS.

UnityФорумОбщее