Pull to refresh

Comments 5

Почему бы не оставлять именных «фантомов» на сервере и проверять именные коллизии(пули должны тоже иметь id стрелявшего) не сдвигая время?
Не уверен, что имеется ввиду под словом «фантом». Я предложение понял так: для каждого игрока в физическом мире заводится не 1, а 12 коллайдеров, и каждый из этих коллайдеров находится в том времени, в котором его видел противник с соответствующим номером. Мы такой вариант сделать не пробовали — он бы нам обошелся существенно дороже в реализации. Что тут хочется отметить:
1) Такой подход не позволил бы нам реализовать второй вариант лагкомпенсации, со «схлопыванием» времени (от которого, справедливости ради, мы в итоге отказались).
2) Двигать коллайдеры все равно придется, просто потому что игроки перемещаются. Но вместо того чтобы условно 12 раз подвинуть 12 коллайдеров, придется один раз сдвинуть 144 (в худшем случае, где все игроки перемещаются и находятся в разном времени). Последний вариант в Unity производительнее, т.к. сцену нужно перестроить только один раз. Поэтому тут большой плюс вашего подхода. Но он похуже по памяти.
3) Проблема тут в том что механизма присвоить коллайдеру «id», который бы учитывался при выполнении физических операций на уровне физического движка — в Unity нет. Есть несколько схожих концепций, но все они имеют свои ограничения:
— В Unity есть слои. Можно разнести коллайдеры по 12-ти разным слоям, и делать, например, рейкаст только в слой стреляющего игрока. В Unity всего 32 слоя, из которых около 15 у нас уже зарезервировано под разные нужды. Если мы раздадим еще по слою на каждого игрока — мы приблизимся к лимиту, и сделать условный режим десматч на 20 игроков уже точно не сможем. Есть вариант перед рейкастом перенести коллайдеры с id игрока на отдельный слой, но он нивелирует все преимущества по производительности (мы такое пробовали).
— В Unity можно выключить ненужные коллайдеры, а после рейкаста их включить. Такие операции, как и манипуляции с номером слоя, приводят к перестроению физической сцены, и бьют по производительности.
— Можно оставить все коллайдеры включенными на одном слое и делать рейкаст через все объекты (RaycastAll). И затем вручную сортировать попадания по дистанции и отбрасывать все коллайдеры, которые принадлежат другим игрокам. Это удорожает стоимость всех физических операций — т.к. растет число коллайдеров на сцене (причем они кучно расположены, что плохо для движка). И появляется дополнительная нагрузка на цпу по сортировке и фильтрации результатов. Станет ли в сумме вся система работать быстрее или медленнее — вопрос открытый.
Недавно зарубился в самолетики в War Thunder, и задавался вопросом как же там мультиплеерная физика сделана. Это же ужас, самолеты сильно зависят от физической модели, вся стрельба именно проджектайлами, причем авиапушки за счет скорострельности генерят эти проджектайлы в огромном количестве. В Kerbal Space Program, например, так и не смогли подружить мультиплеер с физикой полета, несмотря на многие попытки. Было бы интересно почитать подобную статью от разрабов WT.

Интересная статья. Дает некоторое объяснение эффектам во время боя в War Robots. Раз компания одна, то и методы в играх, скорее всего, задействованы одинаковые. В частности, чем больше участников на поле с плохой связью (они замирают или телепортируются), тем сложнее уйти из-под обстрела неуправляемыми ракетами. Особенно, если удар нанесен с большого расстояния. В нормальных условиях прыжок спасает от поражения если прыгнуть увидев ракеты заранее (они медленные). Но когда в игре есть подтормаживания у игроков, то даже явно уйдя из-под удара, теряешь здоровье. Очень заметен этот эффект, если управлять мелким шустрым роботом и бегать, прятаться за предметами от кого-то с неуправляемыми ракетами на коротком расстоянии. При одинаковом положении относительно противника и защиты, ракеты, прилетевшие с 300 метров нанесут урон больше, чем с 200, при том, что шанс уклониться, теоретически, выше. То есть, цель получает урон, как если бы ей управлял некий тормоз.
Но это все при использовании ракет. С пулями, вроде, таких казусов не видел.

Проекты Dino Squad и War Robots разрабатываются разными командами внутри нашей студии. Мы, конечно же, обмениваемся опытом и техническими решениями между командами, но многие вещи в проектах реализованы совершенно по-разному. И сетевой стек в данном случае — одна из таких вещей. Поэтому делать далекоидущие выводы о War Robots из этой статьи не стоит, в роботах все работает по-другому.
Sign up to leave a comment.