Quote:
Originally Posted by Frosterman
Правильнее будет сказать игроки оказывают воздействие, а не синхронизированы.
Quote:
Originally Posted by Frosterman
Отдал пакет с действиями пользователя и забрал в ответ данные об окружающих.
Это синхронизация клиентов. Она делает нагрузку на сеть, но не является проблемой для параллелизирования. Проблема в shared state и его синхронизации между тредами его изменяющими.
Quote:
Originally Posted by Frosterman
И каждый клиент обновляет информацию только о своем игроке и его состоянии. В отдельном потоке, в отдельной сессии, с отдельным пингом и пр. [...] И обрабатывать логику для каждого клиента можно и нужно как раз в отдельном потоке.
К сожалению всё не так просто. Паралеллизация работает отлично только до тех пор пока данные обрабатываемые в каждом треде друг от друга не зависимы. Примеры подходящих данных: видео рендеринг, архивирование(в обе стороны), копирование данных итд.
Как только у тебя появляется shared state который нужно изменить в параллельных тредах (например хп цели в которую стреляют несколько игроков) то тебе нужно позаботиться о Lock'е, который заставит всех остальных подождать пока работает первый тред, иначе получится, так называемый, race condition (
proof). Но при этом такой лок мало того что убивает профит от паралелизирования (треды ждут вместо работы) (
proof) так еще и добавляется удар по производительности из за синхронизации памяти между тредами(
proof).
Изучив всё вышенаписанное, можно на примере некоторых взаимодействий из флотового боя евы понять почему синхронизация серверных тредов будет мешать паралеллизации:
Группа игроков А стреляет в игрока Б, которого лечит группа игроков Ц. С точки зрения сервера ХП игрока Б будет shared state, который пытаются одновременно модифицировать игроки группы А и Ц. Любая параллелизация на этом этапе по сути упрется в lock, чтобы избежать race condition.
Дальше можно добавить еще одну переменную - группу стелс бомберов Д, сбросивших бомбы на игроков А, Б и Ц. Теперь серверу надо произвести геометрические расчеты радиуса поражения бомб и вычислить какие цели попадут под него и сколько дамага будет нанесенно. Результаты этих расчетов сильно повлияли бы все параллельные расчеты с участием групп А, Б и Ц и соответственно все эти треды нуждались бы в синхронизации своих shared states.
В реальности всё было бы ещё на много сложнее так как добавились бы АОЕ баффы, передвижения, появление новых объектов в гриде итд.
По этому все расчеты у ССП идут в одном треде в порядке поступления комманд. Если очередь комманд растёт быстрее чем серверный процессор успевает их обрабатывать то включается замедление времени, которое увеличивает таймера согласно определённому фактору.
Quote:
Originally Posted by Frosterman
Отсечка на коллизии происходит на сервере в момент обновления данных в бд относительно текущего состояния взятого из того же БД.
То что для расчета коллизий и прочих расчетов сервер eve обращается к БД это очень маловероятно, так как обращение к БД как и любая другая IO операция в разы медленнее чем запрос к памяти и приводит к долгому простою процессора в ожидании данных. Скорее всего все нужные для расчетов данные у них уже кешированны в памяти и соответственно изменения состояния тоже вряд-ли сразу сохраняются в бд. Скорее всего сохранение происходит при смене сессии (когда появляется таймер сессии в углу экрана) и при логауте/таймауте сессии.