The Elder Scrolls Online: нет коллизии – нет проблем?

The Elder Scrolls Online: нет коллизии – нет проблем?

Автор публикации в Elder Scrolls Off the Record не является завсегдатаем игровых форумов: просто иногда просматривает пару-тройку тредов по интересующим его играм, редко вступая в споры и обсуждения отдельных аспектов. Но, увидев на официальном форуме Bethesda Softworks горячее «многостраничное» обсуждение коллизий (точнее, их отсутствия) в The Elder Scrolls Online, он не удержался и подготовил большую статью на эту тему. В отсутствие информации от разработчиков предлагаем обсудить этот вопрос; мы касались его редко и вскользь – хотя тут действительно есть о чем поразмыслить.

Один из первых аргументов тех, кто возмущен отсутствием коллизий, звучит так: «В Skyrim же коллизии есть, так почему в The Elder Scrolls Online не будет?»

В Skyrim коллизии есть, так почему в The Elder Scrolls Online не будет?
В Skyrim коллизии есть, так почему в The Elder Scrolls Online не будет?

Помимо очевиднейшей вещи (не сравнивать одиночную игру и ММО!), автор статьи обращает внимание сторонников коллизий на то, что и в Skyrim они были далеко не везде: помните, как мы с легкостью проходили «сквозь» кусты и стволы деревьев? Даже среди синглплеерных игр очень немногие могут похвастаться глубокой коллизией, действующей абсолютно во всех случаях, когда персонаж игрока соприкасается с любым предметом игрового мира.

Игроки, недовольные отсутствием коллизий, в основном пеняют на то, что во время боя можно пройти «сквозь» противника: «Такое ощущение, будто я сражаюсь с призраком!» Elder Scrolls Off the Record приводит простой, неожиданный и логичный контраргумент: «Так не делайте этого! Если для вас так важно ощущать реалистичность происходящего – не стремитесь просочиться сквозь того, с кем деретесь – вот и всё!» Автор статьи утверждает, что лично он никогда не замечал отсутствия коллизий в бою – по той причине, что никогда не пытался «протаранить» своим персонажем соперника, а сохранял какую-то дистанцию.

Другой аргумент ярых сторонников коллизии: «В Age of Conan это есть, и даже в EVE Online!» Верно: обе эти игры тоже онлайновые, но… на этом их сходство с TESO заканчивается. У создателей этих игр были свои причины добавить коллизии, но ведь названные тайтлы очень отличаются от The Elder Scrolls Online и по стилистике, и по общей концепции – в особенности EVE Online.

Нет смысла сравнивать TESO с EVE Online

В EVE коллизии действительно необходимы, чтобы игрокам приходилось осторожничать из страха повредить свои дорогостоящие корабли. Да и вообще, они мчатся в огромном космическом пространстве, в прямом смысле слова – в трехмерном, передвигаются не только по горизонтали, но и по вертикали – а потому сравнение TESO с этой игрой вряд ли уместно. Вдобавок ко всему, в EVE Online бой ведется преимущественно на расстоянии, так что шанс «случайно» врезаться в другой корабль куда меньше, чем в «наземных» тамриэльских битвах с мобами и другими игроками.

Что же касается Age of Conan, то в этой игре PvP не играет такую важную роль, как в The Elder Scrolls Online, где схватки с другими игроками для многих станут основным занятием. Если люди ощущают на себе неприятный "стратегический грифинг", это ведет к жалобам и отмене подписки. Бросить игру от бешенства и досады? Да, именно. Лично я знаю подобные примеры.

Правда, коллизии в PvE – это уже дело другое. Было бы славно, если б, к примеру, пара-тройка мобов смогла буквально прижать игрока к стене, не давая ему улизнуть и обрекая на неминуемую смерть – ну, или наоборот: если б игрок мог загнать моба в угол в прямом смысле слова! Но, к сожалению, коллизии не могут присутствовать в одной части игры и отсутствовать в другой – эти вещи прописываются в движке.

Автор публикации четко заявляет: хотя он не разработчик и не программист, но посвятил изучению коллизий немало времени, прочитал кучу материалов на эту тему. Он готов утверждать: если бы Zenimax Online решили добавить в игру коллизии, то релиз TESO пришлось бы отложить примерно на год! Для добавления коллизий потребовалось бы переписать весь связанный с этим код, потом всё проверить – и переписывать снова и снова, чтобы довести уровень производительности до приемлемого состояния. То есть, фактически пришлось бы вернуться к альфа-стадии – разумеется, при этом условии на подготовку игры к релизу уйдет масса дополнительного времени и денег. К тому же не факт, что игроки согласятся ждать слишком уж долго и не «перегорят»…

В заключительной части статьи ее автор напоминает о необходимости отделять главное от второстепенного. По его мнению, самое главное – получить качественную игру из серии The Elder Scrolls; игру, которая является «элдерскролловской» не только по названию. Именно это важнее всего. А коллизии – что ж, это отличная вещь! Без которой мы вполне сумеем обойтись.

Важнее всего – получить качественную игру серии The Elder Scrolls
Важнее всего – получить качественную игру серии The Elder Scrolls
Прим.ред. Для тех, кто интересуется вопросами коллизий и хотел бы изучить этот аспект подробнее, Elder Scrolls Off the Record прилагает ссылки на специализированные статьи в Gamasutra и IBM.
  • Комментариев: 101
  • Участников: 36
  • Статистика

Обсуждение в комментариях

1912 225
Аватар skuzko
В ответ на запись KiriX (05.01.2014 в 06:43:11):

Да не нужна ему никакая проверка по меняющимся координатам! Просто ответ, свободна ячейка или нет, можно на неё встать или нет (только в том случае, если она для клиента свободна).

Откуда сервер берёт данные о том, свободна ли ячейка или нет? У него как минимум должна быть БД со всеми занятыми ячейками иначе откуда он узнает что там ничего нет? 0_о Так вот индексировать и облегчить поиск куда проще по статичным данным (Я уже и не знаю, какой пример привести для наглядности). Переиндексировать в реальном времени дело просто мегазатратное. Без индексов поиск будет ползать, а не идти.
В ответ на запись KiriX (05.01.2014 в 06:43:11):
Какие вообще стационарные и меняющиеся координаты??? Ты всерьёз думаешь, что сервер "просчитывает" и "предугадывает" твои движения?

Где я про это говорил? 0_о Я про предугадывание ничего не говорил -_-
В ответ на запись KiriX (05.01.2014 в 06:43:11):
Если же речь идёт о поиске пути для мобов, так тут прост всё: строим путь на текущий момент как по статике, в ходе движения проверяем каждую координату, в которой может быть столкновение. Если столкновение есть - строим путь снова, в обход препятствия. И это тоже не сильно нагрузит сервер.

Многократный перезапуск одного и того же вместо однократного не грузит сервер?0_0 Я сегодня всё больше удивляюсь.
В ответ на запись KiriX (05.01.2014 в 06:43:11):

Да ладно тебе - добавят цилиндр, остальное - анимация. Никто не будет тело полностью обрисовывать, т.к. важны всегда лишь две точки пересечения - для каждой модели это будут вершины по вертикали и самые выпирающие по горизонтали (для движения и столкновений - это же тебе не танки или конки на машинах...). К тому же движение-то тут по сути в одной плоскости XY (прыжки не в счёт).

Уже предвижу топики на форуме с заголовком "я застрял в чужой голове" и "Я перепрыгивал моба на три метра выше и врезался в невидимую стену". Кстати, именно по этой причине в ВоТ довольно долго нельзя было ездить по мостам;)
В ответ на запись KiriX (05.01.2014 в 06:43:11):

В который раз: он и так проверяет каждую координату. Без коллизий игрок не является препятствием, с ними - препятствие, и клиент не должен пустить туда встать. При этом стартовая проверка должна быть на клиенте. Если клиент сам видит другого игрока - уже не должен пускать, если препятствий не видит - задача сервака проверить, правда ли их нет по его данным. В конкретной точке. И такая проверка и так уже есть, только другой игрок в ней не препятствие. Понятно?

Чего тут не понятного, вот только без коллизий сервер проверяет среди статичного списка, а при наличие среди динамического. Разница в производительности колосальная. При отсутствии коллизий сервер вообще не проверяет есть ли в этой точке кто-то или нет.
В ответ на запись KiriX (05.01.2014 в 06:43:11):

Ну не знаю... Я видимо в танки редко играю, лаги если и были, я бы не понял, серверные они или нет =)

Они уже более-менее нормальные. Но телепортации и несоответствие серверного прицела клиентскому до дофизического уровня пока не довели. Точнее тогда они практически вообще не случались (после разделения кластеров). И это при 60 ФПС и пинге 5-10 мс.
135 34
Аватар Instant
всё ок - стартовая и конечная точка допустимы. Именно о этому проверяется каждая минимальная точка.

проверяется маршрут. и не по точечно. Если на клиенте не прогрузился объект то можно сквозь него пробежать. и сервер не всегда это отловит.

Зачем ему точку-переменные позиции всех игроков?Если конкретный клиент прислал, что встаёт на конкретную координату (при этом, если для клиента там уже стоит игрок - клиент уже без всякого сервера должен запретить попытку двинуться туда), то просто проверяем свободна ли она и всё!
Это вам не шахматы. Вы имеете громадный мир и точки игроков. И от них идет расчет. Уже хоть как нужно иметь данные о координате объекта. Да и как игрок без сервера узнает что точка занята =)

Я стесняюсь спросить. Вы тут говорите про мой уровень программирования, а можно ли посмотреть ваш профиль на github или чем то подобном?
967 229
Аватар KiriX
Основной профиль. хотя гейм деф на уровне любителя. я больше как то по написанию серверов.

Каких серверов? С чем работали? Похоже, что с игровыми опыта-таки не имели =)
посылаем мы то все. а проверяют только на контрольных точках ибо не нужно нам каждую миллисекунду о допустимости положения.

Ну и что мы с такой проверкой получим? Перед нами стена. Стартовая точка за метр перед стеной, конечная точка - за метр за стеной. Пробегаем с хаком на прохождение сквозь текстуры и по вашей логике для сервера всё ок - стартовая и конечная точка допустимы. Именно о этому проверяется каждая минимальная точка. Обратите внимание - минимальная. И эти минимальная точка будет - размер модельки перса (если загнать модель в идеально подходящий цилиндр - его диаметр, главной точкой которого будет центр его окружности). Можно и меньше сделать, но размера модельки в принципе хватит.
И откуда сервер это узнает? пробежавшись по всем переменным позициям игроков. Опять же проверка нужна имхо чаще.

Ну вот не верю я что вы хоть как-то с программированием связаны =) Либо кодите мега-непродуктивно!
Зачем ему точку-переменные позиции всех игроков?Если конкретный клиент прислал, что встаёт на конкретную координату (при этом, если для клиента там уже стоит игрок - клиент уже без всякого сервера должен запретить попытку двинуться туда), то просто проверяем свободна ли она и всё!

Проверка по стационарным координатам коллизий != проверке по меняющимся координатам коллизий да ещё и в куда больших масштабах. Константы очень легко забуфферизировать, а вот с переменными всё куда печальней.

Да не нужна ему никакая проверка по меняющимся координатам! Просто ответ, свободна ячейка или нет, можно на неё встать или нет (только в том случае, если она для клиента свободна).
Какие вообще стационарные и меняющиеся координаты??? Ты всерьёз думаешь, что сервер "просчитывает" и "предугадывает" твои движения?
Если же речь идёт о поиске пути для мобов, так тут прост всё: строим путь на текущий момент как по статике, в ходе движения проверяем каждую координату, в которой может быть столкновение. Если столкновение есть - строим путь снова, в обход препятствия. И это тоже не сильно нагрузит сервер.
И не забываем, что модель получается трёхмерной и не равномерной по разным сторонам, что так же добавляет развлекухи. Если для нанесения урона ещё можно упростить модель, то для коллизий этого делать не стоит.

Да ладно тебе - добавят цилиндр, остальное - анимация. Никто не будет тело полностью обрисовывать, т.к. важны всегда лишь две точки пересечения - для каждой модели это будут вершины по вертикали и самые выпирающие по горизонтали (для движения и столкновений - это же тебе не танки или конки на машинах...). К тому же движение-то тут по сути в одной плоскости XY (прыжки не в счёт).
Вот только он будет это проверять постоянно для двух тысяч + тел и постоянно обновлять данные по занятым клеткам.

В который раз: он и так проверяет каждую координату. Без коллизий игрок не является препятствием, с ними - препятствие, и клиент не должен пустить туда встать. При этом стартовая проверка должна быть на клиенте. Если клиент сам видит другого игрока - уже не должен пускать, если препятствий не видит - задача сервака проверить, правда ли их нет по его данным. В конкретной точке. И такая проверка и так уже есть, только другой игрок в ней не препятствие. Понятно?
Клиенты как раз не лагали (и с чего бы, вся физика просчитывается на сервере), лагали серваки, причём жёстко. Даже сейчас серверные лаги куда сильнее, чем были до ввода физики, а фпс как был 60, так и остался.

Ну не знаю... Я видимо в танки редко играю, лаги если и были, я бы не понял, серверные они или нет =)
1912 225
Аватар skuzko
В ответ на запись KiriX (05.01.2014 в 06:09:07):

Просчёт движений в уже готовой или меняющейся карте нужен только мобам. Да и им такую проверку прикрутить не проблема, это лишь немного дополнит уже имеющийся поиск пути. Для игроков проверки и так осуществляется постоянно!

Проверка по стационарным координатам коллизий != проверке по меняющимся координатам коллизий да ещё и в куда больших масштабах. Константы очень легко забуфферизировать, а вот с переменными всё куда печальней.
В ответ на запись KiriX (05.01.2014 в 06:09:07):
И опять нет конкретного ответа, что именно должен считать сервер? Что такое коллизия для сервера, как он её понимает и как именно просчитывает? Я как программист кодом интересуюсь. Для меня как прогера коллизия - это возможность нахождение одной точки в опред координатах. Всё. Исходя из этого я не вижу ничего столь давящего на производительность.

На производительность влияет всё, что усложняет систему. Любые новые переменные уменьшают стабильность системы.
И не забываем, что модель получается трёхмерной и не равномерной по разным сторонам, что так же добавляет развлекухи. Если для нанесения урона ещё можно упростить модель, то для коллизий этого делать не стоит.
В ответ на запись KiriX (05.01.2014 в 06:09:07):

ЗАЧЕМ ЕМУ ДОБАВЛЯТЬ 2000 ПЕРЕМЕННЫХ! Проверка идёт только в момент передвижения. Проверка аля можно ли мне сместиться в точку А, не занята ли она. По уму, клиент уже должен знать ответ, а сервер лишь проверит, правильно ли видит клиент, не произошло ли рассинхрона. Всё!

Вот только он будет это проверять постоянно для двух тысяч + тел и постоянно обновлять данные по занятым клеткам.
В ответ на запись KiriX (05.01.2014 в 06:09:07):

Вилами по воде писано, от чего они лагали. От введения именно физики коллизий или от того, что теперь у клиентов нагрузка выросла?
Чтобы ответить на этот вопрос - нужно игру запускать на одном движке с запущенной и отключенной коллизией =)

Эти "вилы" руки разрабов, которые долго и нудно отвечали почему же нет физики;)
Клиенты как раз не лагали (и с чего бы, вся физика просчитывается на сервере), лагали серваки, причём жёстко. Даже сейчас серверные лаги куда сильнее, чем были до ввода физики, а фпс как был 60, так и остался.
135 34
Аватар Instant
Сам же должен понимать, что иначе обмануть сервер проблемы не представляет никакой.

а как по вашему работает спидхак?

Вы с программированием как? Знакомы хоть в общих чертах?

Основной профиль. хотя гейм деф и написание физики на уровне любителя . я больше как то по написанию серверов.

ЗАЧЕМ ЕМУ ДОБАВЛЯТЬ 2000 ПЕРЕМЕННЫХ! Проверка идёт только в момент передвижения. Проверка аля можно ли мне сместиться в точку А, не занята ли она. По уму, клиент уже должен знать ответ, а сервер лишь проверит, правильно ли видит клиент, не произошло ли рассинхрона. Всё!

И откуда сервер это узнает? пробежавшись по всем переменным позициям игроков. Опять же проверка нужна имхо чаще. Опять же то что вы описываете это проверка перед шагом. Она не отличается от просто расчета на сервере. Если проверка после шага то начнутся глюки из-за времени отклика клиент-сервер-клиент.

Стартовая и конечная (стартовая точка - моменты как я нажал движение вперёд, предположим, кнопку "W", до конца, когда я её отпустил) точка движения одна, а маршрут разный.

посылаем мы то все. а проверяют только на контрольных точках ибо не нужно нам каждую миллисекунду о допустимости положения. Как уже говорил в вове клиент рассчитывает шаги, а сервер только периодически их проверяет. Да часто но не на каждый шаг любого игрока.
KiriX
967 229
Аватар KiriX
Проверка сейчас маршрута раз в секунду. Проверка с коллизиями в 20 раз чаще(и сложнее ). Сложнее хотя бы потому что объектов которые преграждают путь увеличивается во много раз

Вы с программированием как? Знакомы хоть в общих чертах?
Кто вам сказал, что сейчас проверка раз в секунду? А если я в эти доли секунды подменю пакет и передам координаты на over9k дальше предыдущей проверки? Нет никакой проверки по времени. Есть как шахматная доска - координаты минимальным делением. Как только наша координата хоть на минимум изменилась - сразу идёт отправка. Ещё раз поясняю: не отправляется клиенту начальная и конечная координаты. Отправляется каждая точка. Если бы было как вы полагаете, то я мог бы 1 метр вперёд пробежать тупо по прямой, а мог бы зигзагами. Стартовая и конечная (стартовая точка - моменты как я нажал движение вперёд, предположим, кнопку "W", до конца, когда я её отпустил) точка движения одна, а маршрут разный.
Но передастся это всё верно, потому как клиент сообщает о каждом своём минимальном изменении координат.
Сам же должен понимать, что иначе обмануть сервер проблемы не представляет никакой.
А что касается сложности из-за того, что объектов много, так тоже чушь. Проверки - очень скоротечны (во всяком случае такие). Заходим в цикл проверки. Проверка 1 - проходит - идём дальше, проверка 2 - не проходит - возвращаем запрет, дальше может быть хоть ещё 99 проверок, мы выходим на сработавшем условии. А коллизии в эту проверку добавят лишь один пункт -есть ли на линии движения игроке не стена, а именно другой игрок (для проверки это будет так, не встречается ли на линии AB точка D (точка C, предположим, это стена и первая проверка была - не встречается ли на линии AB точка C)). Ну и если точка D встречается - рисуем ответ точно такое же как если бы игрок упёрся в стену. Где тут усложнение глобальное, влекущее нагрузки???

Одно дело наложить уже готовую карту коллизий на просчёт передвижений, которую легко заоптимизировать и вообще довести до почти незначимых значений траты ресурсов. Другое постоянно в реальном времени пересчитывать и перестраивать эту модель. Разница будет в порядки.

Просчёт движений в уже готовой или меняющейся карте нужен только мобам. Да и им такую проверку прикрутить не проблема, это лишь немного дополнит уже имеющийся поиск пути. Для игроков проверки и так осуществляется постоянно!
И опять нет конкретного ответа, что именно должен считать сервер? Что такое коллизия для сервера, как он её понимает и как именно просчитывает? Я как программист кодом интересуюсь. Для меня как прогера коллизия - это возможность нахождение одной точки в опред координатах. Всё. Исходя из этого я не вижу ничего столь давящего на производительность.
Если эту переменную (точнее 2000 переменных) надо ещё и добавлять в коллизионную модель, то можешь посчитать сколько "лишних" ресурсов на это уйдёт.

ЗАЧЕМ ЕМУ ДОБАВЛЯТЬ 2000 ПЕРЕМЕННЫХ! Проверка идёт только в момент передвижения. Проверка аля можно ли мне сместиться в точку А, не занята ли она. По уму, клиент уже должен знать ответ, а сервер лишь проверит, правильно ли видит клиент, не произошло ли рассинхрона. Всё!
Лагали, кстати;) И ФПС тут не при чём. Серверные рассчёты не сильно влияют на ФПС, если у разрабов руки не из пятой точки. Серверные лаги легко могут уживаться с 60 ФПС на клиентах, но юзерам от того не легче.

Вилами по воде писано, от чего они лагали. От введения именно физики коллизий или от того, что теперь у клиентов нагрузка выросла?
Чтобы ответить на этот вопрос - нужно игру запускать на одном движке с запущенной и отключенной коллизией =)

P.S: Интересная тема, но спать пора =)
1912 225
Аватар skuzko
В ответ на запись KiriX (05.01.2014 в 05:35:19):

Ты имеешь ввиду возможность толкнуть другого игрока? Это тоже в общем-то не физика. Но тут согласен. Вот это уже дейстивтельно немного повышает нагрузку. Немного, но заметнее чем просто обработка самих столкновений.

Это "немного" заставило Варгеймингов купить компанию с движком и отбиваться от плачущих фанатов года 1,5 (если не больше). Это "немного" создателей Аллодов заставило отказаться от коллизий вообще, хотя уже готовый альфабилд был (сам игрался). И это "немного" не позволило ввести коллизии в ПланетСайд2.
В ответ на запись KiriX (05.01.2014 в 05:35:19):

О5 25. ЧТО ТАКОЕ ПЕРЕСЧЁТ КОЛЛИЗИОННЫХ МДЕЛЕЙ? Что именно там сервер-то считает?

Одно дело наложить уже готовую карту коллизий на просчёт передвижений, которую легко заоптимизировать и вообще довести до почти незначимых значений траты ресурсов. Другое постоянно в реальном времени пересчитывать и перестраивать эту модель. Разница будет в порядки.
В ответ на запись KiriX (05.01.2014 в 05:35:19):
Понимаю, конечно, но серверу-то что с того? Что именно у него в расчётах добавляется. Логику мне можешь описать, что с добавлением коллизий дополнительно просчитывается на сервере? Возмём за факт (с которым, как я думаю, никто спорить не станет), что каждый игрок - это просто точка на игровой карте. Так и что в обработку серверу добавляется с введением коллизий (пока без возможности толкать рассмотрим)?

Каждая точка это дополнительная переменная. Если эту переменную (точнее 2000 переменных) надо ещё и добавлять в коллизионную модель, то можешь посчитать сколько "лишних" ресурсов на это уйдёт.
В ответ на запись KiriX (05.01.2014 в 05:35:19):

Но ММОРПГ с коллизиями же всё-таки есть. И те же танчики, ФПС регулируется прежде всего отключением графических штук, а не коллизий. И разве танки начали лагать после введения физики коллизий (так будет правильнее сказать, коллизии всегда были, а вот их физики не было)?

Лагали, кстати;) И ФПС тут не при чём. Серверные рассчёты не сильно влияют на ФПС, если у разрабов руки не из пятой точки. Серверные лаги легко могут уживаться с 60 ФПС на клиентах, но юзерам от того не легче.
В ответ на запись KiriX (05.01.2014 в 05:35:19):

Ну по мне так сложнее представить себе как бороться с грффингом, чем производительностью - нарастил мощи и производительнсоти хватает. Уж кому-кому, а ТЕСО нечего заботиться мощами серверов =)

Берём модель ВАХи, тупо переносим, грифинга нет и не надо чего-то придумывать.
Вон даже в АА так не погрифиш (хоть там оно очень убого реализовано, расскидываешь союзников/врагов как кегли). Так что от куда спереть идеи всегда найдётся;)

А про сервера ТЕСО... Тебе напомнить как Сиродиил заколбасило (именно серверную часть) в полночь последнего дня?
135 34
Аватар Instant
Понимаю, конечно, но серверу-то что с того? Что именно у него в расчётах добавляется. Логику мне можешь описать, что с добавлением коллизий дополнительно просчитывается на сервере? Возмём за факт (с которым, как я думаю, никто спорить не станет), что каждый игрок - это просто точка на игровой карте. Так и что в обработку серверу добавляется с введением коллизий (пока без возможности толкать рассмотрим)?

Проверка сейчас маршрута раз в секунду. Проверка с коллизиями в 20 раз чаще(и сложнее ). Сложнее хотя бы потому что объектов которые преграждают путь увеличивается во много раз.
Итак вернемся к началу. Почему нужно рассчитывать так часто? Потому что в бою будет критичен каждый шаг. на каждый момент времени а не только в момент удара. сейчас нет такой необходимости. Стены рассчитывает клиент, если клиент напортачит то сервер отловит на следующей обработке по карте допустимых маршрутов.

мы не знаем как бороться с гиффрервми, которые будут мешаться вам играть

Мы не хотим что бы был гриффинг звучит еще лучше.

Вы по ходу даже представить себе не можете, что же такого должен именно начать считать сервер (с программной точки зрения), а всё туда же - увеличение нагрузки. Если вы не можете понять, какие именно ему действия и расчёты добавятся, как вы можете оценить возрастёт нагрузка или нет?

Писал я давненько небольшой 2д движок. Там расчет коллизии нужен был мне только для стен, и это была львиная нагрузка от приложения.
KiriX
967 229
Аватар KiriX
Введение физики и её проверки или полного исполнения (как в ВоТ) очень сильно надавит на сервер.

Ты имеешь ввиду возможность толкнуть другого игрока? Это тоже в общем-то не физика. Но тут согласен. Вот это уже дейстивтельно немного повышает нагрузку. Немного, но заметнее чем просто обработка самих столкновений.
Как минимум постоянный пересчёт коллизионной модели

О5 25. ЧТО ТАКОЕ ПЕРЕСЧЁТ КОЛЛИЗИОННЫХ МДЕЛЕЙ? Что именно там сервер-то считает?
Разницу между константой и переменной и способами их обработки понимаешь?

Понимаю, конечно, но серверу-то что с того? Что именно у него в расчётах добавляется. Логику мне можешь описать, что с добавлением коллизий дополнительно просчитывается на сервере? Возмём за факт (с которым, как я думаю, никто спорить не станет), что каждый игрок - это просто точка на игровой карте. Так и что в обработку серверу добавляется с введением коллизий (пока без возможности толкать рассмотрим)?
И почему тогда так мало ММОРПГ с коллизиями? И почему разработчики (не ТЕСО) говорят, что это увеличивает нагрузки?

Но ММОРПГ с коллизиями же всё-таки есть. И те же танчики, ФПС регулируется прежде всего отключением графических штук, а не коллизий. И разве танки начали лагать после введения физики коллизий (так будет правильнее сказать, коллизии всегда были, а вот их физики не было)?
Ну и как раз гриффинг является левой отмазой. Есть тысяча и один способ избежать гриффинга с коллизиями персонажей. В той же ВАХе не было гриффинга, а коллизии были.

Ну по мне так сложнее представить себе как бороться с грффингом, чем производительностью - нарастил мощи и производительнсоти хватает. Уж кому-кому, а ТЕСО нечего заботиться мощами серверов =)

А проверить в динамике? либо на каждое действие(то есть тот же самые расчеты на сервере), либо постфактум. А постфактум это нам нужно знать когда и кто как двигался в последние n секунд. и перемодулировать ситуацию.(тоже сахар, хотя тут еще можно оптимизировать расчеты. но зато необходимо хранить запись действий за последнее время. Опять же так как данные отвественые то есть необходимость проводить перерасчет очень часто ).

Да сколько раз говорить можно уже, а? И так всё проверяется! С той лишь разницей, что тело другого игрока на твоём пути без коллизий препятствием не считается. Всё разница. А проверки так и так выполняются на лету, но с коллизиями тел другой игрок для тебя - препятствие. Без коллизий тел - не препятствие. Всё!
Это вся та же игровая игровая физика.

Ну сам напросился! =) В тетрисе фигурки падают вниз и сквозь друг друга не проходят. Следуя твоей логике - в тетрисе есть физика =)))
Но представь во сколько вырастет нагрузка если расчеты по перемещению персонажей теперь необходимо проводить в 10 раз чаще как минимум. Не говоря о том что расчеты становятся сложнее

Первую часть я просто пропустил, там ничего нет. А тут ещё раз - ничего чаще проверять не надо будет. Ни на долю секунды. Изменится лишь обнаружение препятствий. Если сейчас А - препятствие, а Б - нет, то будет и А, и Б препятствием. Вся разница. Где и каким образом они сложнее-то становятся? Вы по ходу даже представить себе не можете, что же такого должен именно начать считать сервер (с программной точки зрения), а всё туда же - увеличение нагрузки. Если вы не можете понять, какие именно ему действия и расчёты добавятся, как вы можете оценить возрастёт нагрузка или нет?
а смысл им оправдываться? На них по этому пункту не так уж и давят.

Ну знаешь, оправдаться, что "мы не хотим нагрузки, чтобы у вас не лагало" звучит куда приятнее, чем "мы не знаем как бороться с гиффрервми, которые будут мешаться вам играть". Однако, они понимают, что со стороны другие разрабы за "нагрузки" их насмех могут поднять...
135 34
Аватар Instant
На сервер не передаются данные типа "я тело 1 двигаюсь из A1 в F9",

Да проверка маршрута в статике это просто. А проверить в динамике? либо на каждое действие(то есть тот же самые расчеты на сервере), либо постфактум. А постфактум это нам нужно знать когда и кто как двигался в последние n секунд. и перемодулировать ситуацию.(тоже сахар, хотя тут еще можно оптимизировать расчеты. но зато необходимо хранить запись действий за последнее время. Опять же так как данные отвественые то есть необходимость проводить перерасчет очень часто ).

Коллизии - это модель столкновения, к физике отношения не имеет.

Это вся та же игровая игровая физика.

Так что же это за расчёты такие должны проводиться на сервере, что он всенепременно загнётся, если ввести коллизию тел персонажей и мобов? Что он там такое непосильное считать-то будет? =)

игровая физика один из самых тяжелых моментов по нагрузке. Я к сожалению пока не работал на таких больших проектах и выкладку с цифрами привести не могу. Но представь во сколько вырастет нагрузка если расчеты по перемещению персонажей теперь необходимо проводить в 10 раз чаще как минимум. Не говоря о том что расчеты становятся сложнее

Короче, всё это реально, а возросшие нагрузки - отмаза. Заметьте, даже сами разработчики ни слова о нагрузках не говорят, хотя могли бы оправдаться, типа хотят обеспечить приемлемый уровень FPS. Но они такого не говорят, т.к. понимают, что введение этих коллизий никакой существенно влияющей нагрузки не добавит.

а смысл им оправдываться? На них по этому пункту не так уж и давят.

Добавь 100 тел без ИИ, которые будут истуканами стоять, т.е. те, за действия которых игры не будет отвечать собственными ресурсами. Вот тогда более менее норм сравнение.

стоят это не то. они должны ходить.
p.s. если не веришь про нагрузку то напиши простенькое взаимодействие 200 точек в пространстве и посмотри как это у тебя заработает)
967 229
Аватар KiriX
Проверка на допустимость шага и генерация маршрута по сложности сильно разные.

Молодец! Правильно! А когда генерит маршрут, он каждую точку не проверяет, прежде чем одобрить его (маршрут)? Генерация маршрута - это и проверка на допустимость каждого шага обязательная. С той лишь разницей, что проверка эта происходит перед запуском моба в путь, а не на лету. Вот только эта проверка настолько моментально, что я ни разу не видел "задумавшегося" перед походом моба.
Ешё раз - сервер и так каждую точку проверяет на доступность, что бы как раз не было читов со скоростью (да!) и проходом сквозь стены, камни, горы и прочие текстуры. Другие игроки в этой проверке просто не считаются препятствием.
Это уже допустимость выстрела. она вообще проводится очень редко только по вызову клиента.

Скажи это ВоВу =) Тергечу моба, захожу в домик маленький, кастую спелл - никаких запретов клиент мне не шлёт, если коллизии отключены на сервере. Каст идёт сквозь стену (через которую мне или летит ответный каст - ил несётся злой моб - коллизии то на серваке отклбючены =))
Синглы не загибаются так как им нет необходимости получать данные от сервера. Да и кстати просто на интерес запусти скайрим и в каком нибудь городе добавь сто тел которые не будут стоять на месте.

Сингл по сути клиент-сервер в одном. Все-все-все расчёты смещены в одно приложение. Не думаешь же ты, что те расчёты, что есть на сервер в синглах вообще отсутствуют? В синглах нет только других ГГ и всё. 100 тел добавить не проблема. Добавь 100 тел без ИИ, которые будут истуканами стоять, т.е. те, за действия которых игры не будет отвечать собственными ресурсами. Вот тогда более менее норм сравнение.
Сервер ? да он решит проблему пинга. Если кто то залагал то это только его проблемы он так и останется на месте, так как его маршрут рассчитывается на сервере.

Да не смешите вы народ! Сервер вангует, где окажется игрок! А если я зигзагами бегаю? =))) Маршрут игрока ни разу на сервере на рассчитывается. На сервере только проверяется допустимость маршрута, который шлёт клиент.
Да и нагрузка меньше на канал, так как критично важных данных гораздо меньше. Если в первом случае при расчете на клиенте для нас важно положение каждого игрока на каждые 0.1 то сейчас, нам важно только наше положение которое предрассчитано.

Да что же за глупости вы такие говорите... Есть коллизии или их нет, клиент непрерывно шлёт сообщения о своём текущем положении, никакого "предрассчитано"! Этож какие лулзы можно словить и какой простор для читинга, если "нам важно только наше положение которое предрассчитано."
Не говорите глупостей... Клиент в любом случае постоянно шлёт данные о своих нынешних координатах. Игрок - это точка. Изменяющиеся координаты - её передвижение, отрисовать которое задача других клиентов. Задача сервера передавать эти самые постоянно меняющиеся координаты. Есть тут коллизии или нет, для трафика разницы никакой.
1912 225
Аватар skuzko
В ответ на запись KiriX (05.01.2014 в 05:05:56):

Какое расстояние от Земли до Марса? Такое же как от Марса до Земли!
Ты и так это и говоришь, что, мол, сервер должен просчитывать коллизии и физику (хотя при чём здесь, собственно, физика? Коллизии могут быть без физики, так же как и физика без коллизий).
Коллизии - это модель столкновения, к физике отношения не имеет.

Коллизии не имеют, но введение коллизий без физики убого. Вспомни ВоТ когда там даже трупики двигать было нельзя. Введение физики и её проверки или полного исполнения (как в ВоТ) очень сильно надавит на сервер.
Ну не должны быть игроки непокалебимыми иначе геймплей очень сильно страдает, а в случае если коллизии будут и для союзников работать, то без физики это ещё и замечательный повод для тупорылого гриффинга.
В ответ на запись KiriX (05.01.2014 в 05:05:56):
Так что же это за расчёты такие должны проводиться на сервере, что он всенепременно загнётся, если ввести коллизию тел персонажей и мобов? Что он там такое непосильное считать-то будет? =)

Как минимум постоянный пересчёт коллизионной модели (но это для совсем сирых и убогих проэктов), а так ещё и физику. Будешь утверждать, что физика вещь не затратная по ресурсам?
Да и просто пересчёт коллизий. Разницу между константой и переменной и способами их обработки понимаешь?
В ответ на запись KiriX (05.01.2014 в 05:05:56):

Короче, всё это реально, а возросшие нагрузки - отмаза. Заметьте, даже сами разработчики ни слова о нагрузках не говорят, хотя могли бы оправдаться, типа хотят обеспечить приемлемый уровень FPS. Но они такого не говорят, т.к. понимают, что введение этих коллизий никакой существенно влияющей нагрузки не добавит.

И почему тогда так мало ММОРПГ с коллизиями? И почему разработчики (не ТЕСО) говорят, что это увеличивает нагрузки?
Ну и как раз гриффинг является левой отмазой. Есть тысяча и один способ избежать гриффинга с коллизиями персонажей. В той же ВАХе не было гриффинга, а коллизии были.
967 229
Аватар KiriX
Коллизии персонажей и и физику их взаимодействия.

Какое расстояние от Земли до Марса? Такое же как от Марса до Земли!
Ты и так это и говоришь, что, мол, сервер должен просчитывать коллизии и физику (хотя при чём здесь, собственно, физика? Коллизии могут быть без физики, так же как и физика без коллизий).
Коллизии - это модель столкновения, к физике отношения не имеет.

Так что же это за расчёты такие должны проводиться на сервере, что он всенепременно загнётся, если ввести коллизию тел персонажей и мобов? Что он там такое непосильное считать-то будет? =)

Сервер так и так учитывает положение всех игроков (как точки), что же ему прибавится от коллизий?

От пинга никак, а от эксплойтов такие расчёты избавляют (не на 100%, но куда лучше, чем на клиенте).
Читаков будет на порядок меньше.

Так проверки и так есть, чтобы сквозь стены не ходили. Я же говорил, занимался я серваком. Есть там такая проверка - если на прямой лини перед персом (по движению) препятствие. И вот серверу совершенно пофиг что будет этим препятствием - стено дома, гора, камень или бренное тело другого игрока. Проверка всё равно есть, только сейчас в ней тело перса препятствием не считается. Всё.
Если тело другого игрока сделать препятствием - даже число таких проверок ничуть не увеличится, изменится лишь возвращаемый результат, а именно будет чаще попадаться, что движение в заданную точку запрещено.

На сервер не передаются данные типа "я тело 1 двигаюсь из A1 в F9", сервер непрерывно передаёт координаты положения игрока серверу, а на сервере уже происходит сверка и синхронизация. Чтобы дикого рассинхрона не было, нужно, чтобы коллизии просчитывались и клиентом независимо от сервера, иначе при отключении сервака будет шизо-картинку наблюдать с резко становящимися проходимыми телами других игроков. А так иногда лишь может (из-за пинга) нас назад телепортнуть, т.к. по результатам проверки сервера мы не смогли бы переместиться в указанную точку и он форсировано заставить клиента вернуть модель в рассчитанную им точку.

Короче, всё это реально, а возросшие нагрузки - отмаза. Заметьте, даже сами разработчики ни слова о нагрузках не говорят, хотя могли бы оправдаться, типа хотят обеспечить приемлемый уровень FPS. Но они такого не говорят, т.к. понимают, что введение этих коллизий никакой существенно влияющей нагрузки не добавит.
135 34
Аватар Instant
По поводу моба, как же нет необходимости рассчитывать, может ли он сходить так или иначе? Говорю же, без коллизий на стороне сервера мобы шпарят сквозь стены!

Если это так названо в эмуляторе то это не говорит о том что сервер перепроверяет маршрут на допустимость на каждое действие(тот же перерасчет а коротким ли я путем иду проводится примерно раз в секунду). Проверка на допустимость шага и генерация маршрута по сложности сильно разные.
Да конечно! Без серверной обработку огнешарики сквозь деревья и только так летают.

Это уже допустимость выстрела. она вообще проводится очень редко только по вызову клиента. но да тут я ошибся это своего рода коллизия.

Клиент загнётся? А клиенту-то с чего загибаться??? Что он там такое считать-то будет? Синглы-то вон почему-то не загибаются от обилия НПС
Синглы не загибаются так как им нет необходимости получать данные от сервера. Да и кстати просто на интерес запусти скайрим и в каком нибудь городе добавь сто тел которые не будут стоять на месте.

Пинг-пинг-пинг. Он всегда был, есть и будет есть =) И как расчётами на стороне сервера от него избавиться-то? =) Чем тут сервер поможет? Вы прям в сервере какого-то кудесника-волшебника видите. А это не так. Машинный код подчиняющийся строгой логике. Что он может сделать с пингом?
Сервер ? да он решит проблему пинга. Если кто то залагал то это только его проблемы он так и останется на месте, так как его маршрут рассчитывается на сервере.
Да и нагрузка меньше на канал, так как критично важных данных гораздо меньше. Если в первом случае при расчете на клиенте для нас важно положение каждого игрока на каждые 0.1 то сейчас, нам важно только наше положение которое предрассчитано.
1912 225
Аватар skuzko
В ответ на запись KiriX (05.01.2014 в 04:46:32):

Пинг-пинг-пинг. Он всегда был, есть и будет есть =) И как расчётами на стороне сервера от него избавиться-то? =) Чем тут сервер поможет? Вы прям в сервере какого-то кудесника-волшебника видите. А это не так. Машинный код подчиняющийся строгой логике. Что он может сделать с пингом?

От пинга никак, а от эксплойтов такие расчёты избавляют (не на 100%, но куда лучше, чем на клиенте).
Читаков будет на порядок меньше.
967 229
Аватар KiriX
Для выстрелов вообще нет коллизи. А вот у мобов не совсем так. У них рассчитывается оптимальный маршрут и моб по нему топает, нет необходимости на каждый шаг проверять, а мог ли он так сходить или нет.

Да конечно! Без серверной обработку огнешарики сквозь деревья и только так летают.
По поводу моба, как же нет необходимости рассчитывать, может ли он сходить так или иначе? Говорю же, без коллизий на стороне сервера мобы шпарят сквозь стены!
Проблема в ответственности данных. В том же вове все дистанции перед ударами проверял сервер. И там не было необходимости каждую 0.04 секунды иметь точные данные дистанции до каждого более менее близко стоящего игрока.
Теперь представляем: махач, набижала толпа по 100 тел с каждой стороны. Для веселья еще и 70% милишников. У половины обычный инет со всеми вытекающими лагами. Ты ударяешь противника и немного на него напираешь, что бы зажать в телах его же союзников. А тут у него пролагануло и он спокойно прошел сквозь тебя. и теперь ты зажат во всех сторон противниками. весело?
И любой небольшой лаг на любом клиенте приведет к подобным призрачным прохождениям(нет ну можно установить кучу проверок, увеличив еще раз нагрузку на интернет и приведя к ситуации когда в толпе никто не может сделать шаг).

Пинг-пинг-пинг. Он всегда был, есть и будет есть =) И как расчётами на стороне сервера от него избавиться-то? =) Чем тут сервер поможет? Вы прям в сервере какого-то кудесника-волшебника видите. А это не так. Машинный код подчиняющийся строгой логике. Что он может сделать с пингом?
Еще учитваем то что расчеты для проверок маршрута среди статических объектов проводить проще чем среди динамических. А при вынесении расчетов коллизи на клиент, клиент в толпе игроков начнет грустить.

Ясен пень статика проще. Вот только чем динамика от статики отличается-то? Ну есть статический объект - это точка со своими границами, заданными на опред расстоянии в определённом направлении от этой самой точки. Динамический объект - та же самая точка с такими же границами, только двигаться может.
В который раз спрашиваю - что по вашему мнению должен рассчитывать сервер-то в этих самых коллизиях? Ни там не ответили, ни тут не предвидится...
Клиент загнётся? А клиенту-то с чего загибаться??? Что он там такое считать-то будет? Синглы-то вон почему-то не загибаются от обилия НПС (если они без особого ИИ пакета).
1912 225
Аватар skuzko
В ответ на запись KiriX (05.01.2014 в 04:33:13):

Ещё раз - что именно должен рассчитывать сервер? =)

Коллизии персонажей и физику их взаимодействия. Пусть даже такую простую, как в АА (тупо поталкать друг друга слегка). Если это отдать клиенту... Ну ниже уже расписали. А так народ в Ла2 торренты на полную включал и пробегал сквозь чужой строй (самый простой способ);)
В ответ на запись Instant (05.01.2014 в 04:33:15):

Это еще не показатель. В Вове тоже откидывает иногда когда сервер не уверен в подсованых от клиента данных.

Ну, значит, как минимум проверяет. Хотя такую вероятность я не учитывал, т.к. раньше с таким не сталкивался.
135 34
Аватар Instant
Да, клиентскую модельку игрока обрабатывает клиент (не даёт проходить сквозь здания), но за других игроков клиент уже не отвечает.

как бы это логично. За других игроков отвечает уже их клиент. Если бы мой клиент рассчитывал бы положение и маршруты остальных игроков то я бы повесился в столице. Не говоря о том что спидхак приобрел бы еще много много применений. Пара человек с ним могла бы запирать других игроков в выдуманных стенах.

А вот для мобов без знаний сервера о коллизиях мобы и файерболы преспокойненько сквозь деревья и стенки проходят.

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

В принципе тот же самый bounding radius, нужно только заставить клиента реагировать на него как на непреодолимое препятствие

Проблема в ответственности данных. В том же вове все дистанции перед ударами проверял сервер. И там не было необходимости каждую 0.1 секунды иметь точные данные дистанции до каждого более менее близко стоящего игрока.

Теперь представляем: махач, набижала толпа по 100 тел с каждой стороны. Для веселья еще и 70% милишников. У половины обычный инет со всеми вытекающими лагами. Ты ударяешь противника и немного на него напираешь, что бы зажать в телах его же союзников. А тут у него пролагануло и он спокойно прошел сквозь тебя. и теперь ты зажат во всех сторон противниками. весело?

И любой небольшой лаг на любом клиенте приведет к подобным призрачным прохождениям(нет ну можно установить кучу проверок, увеличив еще раз нагрузку на интернет и приведя к ситуации когда в толпе никто не может сделать шаг).

Со стенами таких проблем нет. Потому что они прогрузились(или даже заранее объявлены в клиенте) и все. Нет необходимости постоянно получать их положение. Еще учитваем то что расчеты для проверок маршрута среди статических объектов проводить проще чем среди динамических. А при вынесении расчетов коллизи на клиент, клиент в толпе игроков начнет грустить.

И если осуществить проверку, а не прошел ли игрок куда ему не следует в обычном относительно просто, то в случае с коллизией тел это почти нереально. Почти сразу появится самурай хак на клиент позволяющий пробегать сквозь своих. Который и не отловить.

Кстати практически всё передвижение в ТЕСО просчитывается на сервере, когда были перебои с пингом меня откатывало.

Это еще не показатель. В Вове тоже откидывает иногда когда сервер не уверен в подсованых от клиента данных.