DayZ: Сетевой код
Отчаянные попытки понять мистический рассинхрон.
Товарищи, подскажите пожалуйста дураку.
Как всем известно (ну, всем кто хотя бы раз видел эту игру), в DayZ жуткий рассинхрон. Выражается это буквально во всём: союзный персонаж даже остановившись, продолжает двигаться стоя, поскольку сервер продолжает уточнять его местоположение на карте; урон по противнику чаще всего фиксируется с ощутимой задержкой, как визуально, так и фактически; тоже самое с активацией каких-либо подвижных объектов.
Происходило это ещё на движке Армы 2, когда DayZ был всего-лишь модом, а потому я понимающе прощал этот технический недостаток. При разработке самостоятельной игры, разработчики, на сколько я помню, утверждали, будто бы ощутимо модифицировали движок тогда уже существующей Arma 3, дескать, спецом под их выживач, чтобы оптимизировать все издержки технических нюансов.
С тех самых пор прошло... сколько, почти 10 лет? А воз и ныне там.
До появления батлроялей, я ещё мог предположить, что всё упирается в обилие разбросанных объектов по огромной карте и живых игроков, что всячески взаимодействуют с ними, но теперь это самая нелепая отмазка, которую можно придумать.
В любом случае, разработчики не в состоянии исправить этот недуг. И вот у меня возник вопрос.
Чтобы настроить сетевой код должны образом, они вынуждены переписать движок, или можно было бы интегрировать уже существующие наработки чужого сетевого кода, который бы обеспечил комфортную онлайн составляющую?
К примеру, ровно такой же рассинхрон (1 в 1) я вижу в... Star Citizen :D Что ещё больше повергло меня в шок. Ведь если предположить (да-да, я понимаю, это безумные фантазии умалишённого), что игра выйдет, предоставив гигантский пласт контента, как можно получать удовольствие от процесса, когда постоянно всё дёргается, телепортируется и никак не синхронизируется с действиями игрока? Разве сетевой код не является фундаментом любой онлайновой игре? Но это уже так, риторические излишки.
Собственно, повторю вопрос: чтобы в условном DayZ избавиться от рассинхрона, нужен новый движок или можно модифицировать текущий? Есть у нас специалисты по данному вопросы?
Богемия в этом деле дольше практически всех на плаву и с кодом у них все хорошо. Многие говорят что их игры не оптимизированы, но нету больше игр где прорисовку можно установить аж на 20 километров и оно будет работать. Во всех мультиплеерных играх есть проблемы с рассинхроном, даже у тех, в которых меньше 10 игроков одновременно играют. Каждого игрока надо синхронизировать с каждым другим игроком, сервер одновременно должен скидывать всем о расположении, направлении взгляда, анимациях, нужных выполняемых локальных скриптах, выполнять глобальные скрипты, и вагон всего сверху.
Рассинхрон происходит во всех "упитанных" играх, просто не всегда игроки его видят. Например, сервер может прогнозировать некоторые действия игрока наперед. В небольших мультиплеерных играх это работает отлично, но чем больше в игре возможностей у игрока, тем сложнее прогнозировать его дальнейшее действие, в крупных играх это будет только лишняя трата ресурсов. Так же некоторые игры "делают вид что все хорошо", обманывают игроков одним словом. Суть в том, что у каждого игрока локально просчитывается также физика других игроков и если произойдет "рассинхрон" - другой игрок просто не сможет телепортироваться или неестественно дернуться. Это визуальное решение, в таких играх у вас будет много вопросов типа "а как меня убили если я уже в укрытии?" - у другого игрока вы еще не были в укрытии, и он выстрелил вам в голову. У него локально произошла ваша смерть, информация о чем была передана на сервер, который официально убил вас несмотря на то, где вы находитесь. Привет GTA V - лакомый кусочек для читеров, которые воротят дела у себя локально, а сервер просто синхронизирует "это" и страдают в итоге все глобально...
Способы извернуться, чтобы визуально удовлетворить игрока есть, но все они со своими подводными камнями и их конечно надо правильно уметь использовать. DayZ, Arma, SCUM, Tarkov, и другие подобные игры помимо синхронизации игроков владеют еще множеством ИИ. Некоторые думают что контролировать ИИ это проще чем синхронизировать игрока, но на самом деле ИИ тоже нужно синхронизировать но и помимо этого следить за его логикой, думать за него. Множество ситуаций в которые может попасть ИИ должно быть учтено, а это вагон работающих скриптов сверху.
В арме люди заходят на сервер и жалуются что у них 30 кадров и рассинхроны, но надо учесть - на сервере играет 50 игроков и еще 300 ботов. Это же безумие синхронизировать столько. Да и боты не простенькие, они должны уметь реагировать на кучу вещей: на мины, на технику, на воздух, менять свое положение, понимать куда двигаться, отрядные их взаимодействия, целиться куда надо и стрелять в конце концов.
В DayZ все аналогично, только используются зомби, они "легче". Видят цель - бегут за ней, бьют.
В коде армы или дейзи сейчас осталось мало чего "плохого" или "лишнего", наоборот - там все почти идеально. Владельцы серверов настраивают их как им будет угодно. "Для чего нам 300 ИИ одновременно на карте? Давайте заместо мы сделаем спавн ботов на безопасном расстоянии от игрока, он не заметит разницы." - почему бы нет? Или можно отключить часть их функционала... Или просто отключить их моделирование и логику если они дальше определенного расстояния от игрока. Все зависит от держателей сервера.
Вишенка на торте - использование "безголовых клиентов" которые разгружают сервер. Суть - вынести часть вычислений или синхронизации в отдельный процесс или даже на отдельный серверный ПК. Вынести можно почти что угодно сильно разгрузив основной процесс, чаще всего выносят всю логику ИИ и выполнение скриптов. Таким образом из 300 выше упомянутых ИИ можно сделать 1000 (если они не в одном месте размещены конечно) без значимых потерь.
Учесть что в этих играх, помимо игроков, ИИ-ботов, большого мира имеется также и разная техника у которой своя физика, которая должна быть приспособлена к разным ситуациям. Тут начинается больное место текущих движков армы и дейзи. В одиночной игре техника ведет себя идеально, но в мультиплеере начинаются настоящие полеты на луну. Техника это очень требовательный объект в любой игре, а у богемии еще требовательнее, поскольку отдельно настроены все её части. Машинка - требовательная. Самолет - просто пожиратель ресурсов.
Арма стала не игрой, а практически площадкой для других игр. Как только не изворачиваются администраторы разных серверов и чего только в ней еще не было.
Это еще далеко малая часть многих технических моментов. Богемией можно восхищаться, немного студий в наше время настолько запариваются над механиками и возможностями;
"У вас нет возможности прыгать в игре." +100500 недовольных отзывов в стиме.
Но зачем вам прыгать в бою? Если вам так необходимы прыжки - модификация весит несколько килобайт. Можете засунуть её на свой сервер и сделать необязательной. Кому не надо - не смогут прыгнуть, кому надо - установят и смогут прыгать. Идеальная площадка для модификаций.
Я могу уверить что разработчики богемии пошли намного дальше "проблем с сетевым кодом". Большая часть стабильности на серверах зависит от их настройки, скриптов, модов, пропускной скорости, количества ИИ, количества игроков. Значимую часть играет пинг и лаги у самих игроков, которые тормозят ответы от их локально выполняемых скриптов серверу. И в очень малой части этой проблемы виноват движок.
чтобы в условном DayZ избавиться от рассинхрона, нужен новый движок или можно модифицировать текущий? Есть у нас специалисты по данному вопросы?
Ответ на твой вопрос интуитивный - убрать из игры все к чертям, урезать количество игроков, убрать большинство механик и логики ИИ. И вот ты сможешь играть с несколькими друзьями без никаких рассинхронов! Правда игра эта уже будет скорее как Call of Duty.
Ну, во-первых, DayZ является портом с движка RV на движок Enfusion, как уже отмечалось выше. Со всеми издержками портов в виде нерабочих кусков кода.
Во-вторых, серверное приложение так и не научилось в мультитрединг "из коробки", любой владелец сервера DayZ вам скажет, что лучше брать процессор с как можно более мощным ядром. Да, умельцы используют какие-то параметры запуска аля "количество потоков", но практика показала что это, скорее, плацебо.
В-третьих, количество симуляций. Ни в каких армах и пабгах ими и не пахло в таких масштабах. Возьмем для примера простую ситуацию: игрок пьет бутылку воды в здании. Что при этом происходит в пабге: накидывается модификатор и происходит синхронизация анимации. Что происходит в DayZ: учитывается наличие одежды на голове, количество выпитого, калорийность, наличие бактерий в напитке, помыты ли у персонажа руки, синхронизации анимаций, рассчёт шума для ИИ. Паралельно идёт миллион рассчетов для самого персонажа, начиная тем, какие каллории и бактерии попали в его желудок и в каком количестве, заканчивая просчетом передачи намокания между предметами, потому что персонаж только что из под дождя, и, как следствие, предметы начинают по-другому весить в зависимости от степени намокания, и по-другому хранить тепло. Со стороны может показаться, что я натягиваю сову на глобус, но это только вершина айсберга - просчетов на деле настолько много, что перечислить все и ничего не забыть попросту невозможно. Я лишь хочу сказать, что в DayZ другие масштабы, это игра не о стрельбе, как таковой, а о том, убьете ли вы оленя выстрелом в голову, чтобы не повредить его тело и получить больше мяса.
Ну и последнее - моды. Благодаря им игра жива. Но большинство модов делаются без учёта каких бы то ни было оптимизаций, а некоторые так и вообще с вопиющими ошибками. Например, существует платный мод на КПК, чтобы игроки могли общаться внутри игры с помощью этого устройства. И всё бы ничего, да только при заходе на сервер пользователю отпраляется одним массированным RPC-запросом вся БД переписки. Казалось бы, но впредь при получении нового сообщения на КПК игрок получает не само сообщение, а очередную копию всей БД. Это ещё не всё: такая копия приходит не тогда, когда игроку отправили сообщение, а каждые несколько секунд по таймеру. Если подитожить наш пример: каждые несколько секунд все пользователи одновременно получают копию всей БД переписок. Последствия очевидны. Я не отрицаю, что существуют и оптимизированные моды, но обычно авторы модификаций не чувствуют границ. В данном вопросе вся ответственность ложится на плечи администрации серверов.
Даже без учёта любой из вышеперечисленных характеристик, даже если все модификации убрать, я уверен, игра будет с таким же рассинхроном. К примеру, банальная битва с зомби выглядит как нечто абсурдное. Зомби рандомно, невпопад шатает башкой от удара, который наносится игроком не в соответствии с анимацией. И выглядит всё так: зомби маячит башкой туда-сюда, словно от сильного ветра, игрок нелепо машет руками, издаются звуки, но нет веры в то, что я наношу урон, а потом бац, и зомби сам по себе упал.
Вопрос. А смысл в миллиард характеристик, если элементарные вещи выглядят так убого и рушат всё погружение в игровой процесс?
У разрабов есть доступ к исходникам ядра движка? Если да, то сетевой код точно можно переписать. Насколько я знаю, DayZ пилят на собственном движке студии Богемии, соответственно у разрабов есть исходники. Так что дело тут в лени разработчиков.
Глянул вики:
DayZ использует движок Real Virtuality 3, доработанный по сравнению с той версией, которая использовалась в ArmA 2, но не совпадающий с использованным в Arma 3 движком Real Virtuality 4.
Real Virtuality (рус. Реальная виртуальность) — игровой движок, разработанный чешской компанией Bohemia Interactive Studio. Первоначальное название движка — «Poseidon» (рус. Посейдон).[1] Движок постоянно совершенствуется и используется во всех проектах Bohemia.
Ну, учитывая что в графе разработчик Дейзи значится Bohemia Interactive, то доступ к ядру движка полный.
В DayZ уже давно нет проблем с рассинхроном. Если только на серверах с кучей модификаций