Комментарии 15
Вращение лучше на кватернионах делать. Подозреваю, будут проблемы, когда кратчайшим будет поворот из 359 градусов в 1 градус.
Еще мне кажется, что следовало бы сразу реализовывать инстанциирование боидов в пулл
Еще мне кажется, что следовало бы сразу реализовывать инстанциирование боидов в пулл
+1
Не успел дописать про пулл…
Если завести синглтон или просто статический менеджер боидов с пуллом инстансов, то не нужен будет код, вида:
Достаточно будет пробегаться по боидам в менеджере и сравнивать текущее расстояние до них с пороговым. В зависимости от этого и удалять/добавлять инстансы в свою колекцию действующих на тебя соседних боидов.
PS: Сейчас боиды инстанциируются один раз при старте (если я правильно понял), но потом может понадобиться изменять размер стаи. Тогда пулл позволит не делать инстанциирование в реальном времени. А инстанциирование, как известно, дорогая операция.
Если завести синглтон или просто статический менеджер боидов с пуллом инстансов, то не нужен будет код, вида:
boids = Physics.OverlapSphere(tr.position, cohesionRadius, boidsLayer.value);
Достаточно будет пробегаться по боидам в менеджере и сравнивать текущее расстояние до них с пороговым. В зависимости от этого и удалять/добавлять инстансы в свою колекцию действующих на тебя соседних боидов.
PS: Сейчас боиды инстанциируются один раз при старте (если я правильно понял), но потом может понадобиться изменять размер стаи. Тогда пулл позволит не делать инстанциирование в реальном времени. А инстанциирование, как известно, дорогая операция.
+1
Если пробегаться и сравнивать каждого с каждым, то получаем сложность O(n^2) и потолок в пару сотен боидов. Внутри Physics.OverlapSphere скрывается какая-то оптимизированная магия от Nvidia, которая делит пространство на кусочки и ограничивает область поиска.
У меня была идея сделать иерархию симуляций боидов, чтобы, например, десять боидов всегда знали о существовании друг друга. У этих десяти боидов есть командир, который знает о существовании девяти других командиров. У них в свою очередь тоже есть кто-то выше и так далее. Но в итоге всё выглядело очень странно, у меня не получилось толком настроить эту мешанину, хотя в интернете встречал такой подход.
У меня была идея сделать иерархию симуляций боидов, чтобы, например, десять боидов всегда знали о существовании друг друга. У этих десяти боидов есть командир, который знает о существовании девяти других командиров. У них в свою очередь тоже есть кто-то выше и так далее. Но в итоге всё выглядело очень странно, у меня не получилось толком настроить эту мешанину, хотя в интернете встречал такой подход.
0
Подозреваю, что работать эффективно та магия будет только на железе от Nvidia. Тогда потеряете в переносимости. Как вариант, сделать похожую оптимизацию в логике. Разбить сферу спавна на конечное число зон, разместить по случайным зонам нужное число боидов и статически назначить нужное количество соседей (ну или один раз по радиусу определить). Жестко карать боидов за излишнее смещение боида относительно исходного центра или лидера стаи.
ПС: извините… Недочитал каммент с мобилы. Вы предложили то же.
ПС: извините… Недочитал каммент с мобилы. Вы предложили то же.
+1
У статических соседей проблема оказалась в том, что они статические :) Становится заметно, что все боиды передвигаются кучками. Я пробовал разбавлять иерархию одиночными боидами, но всё равно каша получалась с комочками. По идее, если иногда случайным разбивать группы на одиночек, а потом собирать в новые группы, то будет смотреться лучше. Но как я уже говрил, получается слишком много параметров для настройки, и я забросил этот вариант. Проще на GPU симуляцию делать, десятки тысяч боидов всё равно мало где нужны.
0
> Проблема решается отделением модели от коллайдера в иерархии
То есть навесить коллайдер не на модельку птички, а на её родительский (пустой?) объект, который не будет вращаться, но будет перемещаться, так?
Но тогда вращение нужно делать на внутренний объект с моделью, а перемещение — на внешний с коллайдером и внутренним. Или я что-то не понял?
Покажите, пожалуйста, скриншот окна иерархии, чтобы было понятнее.
То есть навесить коллайдер не на модельку птички, а на её родительский (пустой?) объект, который не будет вращаться, но будет перемещаться, так?
Но тогда вращение нужно делать на внутренний объект с моделью, а перемещение — на внешний с коллайдером и внутренним. Или я что-то не понял?
Покажите, пожалуйста, скриншот окна иерархии, чтобы было понятнее.
0
Transform и GetComponent
Я краем уха слышал, что в пятом Юнити уже заоптимизировали этот кейс и можно смело его использовать. Нет?
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Оптимизируем Boid'ов на Unity