Более 15 лет назад у игроков наконец появилась возможность играть вместе, и не в какие-то автоматы с примитивными играми, а в полноценные технически сложные творения.
Подраться в Tekken, пройти Resident Evil, погоняться в Gran Turismo на раздвоенном экране - все это не имеет никакого отношения к сетевой магии, но задало вектор развития мультиплеерной составляющей.
Первые MMORPG будоражили численностью игроков на серверах, а сейчас будоражат королевские битвы, где сервер обрабатывает данные сотни игроков с молниеносной скоростью.
Заслуга сервера? Частично. За те объемы данных, что прыгают между сервером и клиентом, отвечает сетевой код. Какая информация обычно путешествует по кабелю и когда ей нужно это делать? В этой статье.
Базовый набор
Самым главным в мультиплеере является конечно положение, передвижение игроков и здесь можно всякого наворотить.
Допустим шутер, что играет 16 игроков, нужно ли каждый тик серверу отправлять каждому из них местоположение остальных 15? Скорее всего.
А вот ММОРПГ, на сервере которой пару тысяч игроков? Нет.
Технически мир разбит на локации и хабы и сервер посылает клиенту информацию в основном о том, что внутри или поблизости, ну и конечно особых персон - рейд или группу, местоположение которых в мире можно узнать откуда угодно.
А когда персонаж попадет в дистанцию рендера, сервер пошлет еще информации :
- Поворот, что может быть выражен одной переменной (поворот по Y), а так же для шутеров характерен вектор взора, на основе которого клиент создает анимацию поворота тела.
- Состояние. Состояние приседания это не только булевая переменная, это анимация и изменение высоты контроллера-коллайдера, но имеет смысл передавать лишь сам факт, триггер приседания, к которому клиент сам все пришьет.
- Особые действа. Будь то выстрел или бафф, сервер конечно их не мониторит, они как правило тригеррят сопроцесс, абстрактно существующий от других. В нем отдельно просчитаются траектории, запустится таймер и потом выгрузятся из памяти, будто их и не было.
- Физика. Весьма непредсказуемый аспект, который может крайне сильно нагрузить сервер в следствии обилия циферок. (Динамичное изменение векторов каждой из вершин коллайдера физически симулируемого объекта. А что если их несколько?)
Расчеты для ragdoll-физики, например, всегда происходят на стороне клиента, как и разрушаемость зданий или составных объектов. Сервер пошлет лишь точку применения сил и их численное значение.
Как не надо
Допустим гениальный Вася из 5-Б, из найденных в интернете ассетов и обрывков кода сотворил свою MMORPG с фэнтезийным блэкджеком, грудастыми эльфийками и рейд-боссом математичкой.
Дабы пристально наблюдать за гриндящими кабанчиков одноклассниками, в центре королевства Вася воткнул замок и трон, но, увы, в "Wow killer starter pack" не нашлось анимации задумчивого восседания, пришлось делать самому.
Отныне каждый игрок сервера знал, когда Вася садится на трон, ибо каждый тик от сервера передавались положения и повороты каждой из косточек и вместо "Praise the Vasya" слышалась лишь отборная брань игроков с четырехзначным пингом.
у всяких мультиплеерных игор ваще есть такая условная проблема. это проблема мультипоточности и несвязанных потоков вычислений в длительное время например в физике от сюда вытекает проблема локальности. это проблема не решаема даже современным супермногопоточным сервером. возможен такой вариант что клиент возьмет на себя чать расчетов в том числе и расчетов косвенно к нему относящихся и настанет коммунизм. но тут так сказать возникнут проблемы с биг датой и неопределенностью гейзенберга когда с точки зрения одного игрока стрела попала в колено а с точки зрения другого то нет. и в любом случае несущему серверу понадобятся большие мозги. поэтому на каком то этапе значится графоно и геймплейные интересы сингловых игр и мультиплеерных игр расходятся. в том проблем что в сингловых в общем то возникает меньше проблем с локальностью и предсказуемостью поэтому в сингле возможна то некая физика окиана чтоб ирок мог воздействовать на хляби ньютоновской физикой а в мультиплеере реализация такого весьма означится затруднитиельна.
Какая кстати сейчас игра с самым лучшим сетевым кодом?