Игры изнутри : сетевой код

Более 15 лет назад у игроков наконец появилась возможность играть вместе, и не в какие-то автоматы с примитивными играми, а в полноценные технически сложные творения.

Подраться в Tekken, пройти Resident Evil, погоняться в Gran Turismo на раздвоенном экране - все это не имеет никакого отношения к сетевой магии, но задало вектор развития мультиплеерной составляющей.
Первые MMORPG будоражили численностью игроков на серверах, а сейчас будоражат королевские битвы, где сервер обрабатывает данные сотни игроков с молниеносной скоростью.

Заслуга сервера? Частично. За те объемы данных, что прыгают между сервером и клиентом, отвечает сетевой код. Какая информация обычно путешествует по кабелю и когда ей нужно это делать? В этой статье.

Базовый набор

Самым главным в мультиплеере является конечно положение, передвижение игроков и здесь можно всякого наворотить.

Допустим шутер, что играет 16 игроков, нужно ли каждый тик серверу отправлять каждому из них местоположение остальных 15? Скорее всего.
А вот ММОРПГ, на сервере которой пару тысяч игроков? Нет.

Технически мир разбит на локации и хабы и сервер посылает клиенту информацию в основном о том, что внутри или поблизости, ну и конечно особых персон - рейд или группу, местоположение которых в мире можно узнать откуда угодно.

А когда персонаж попадет в дистанцию рендера, сервер пошлет еще информации :

  • Поворот, что может быть выражен одной переменной (поворот по Y), а так же для шутеров характерен вектор взора, на основе которого клиент создает анимацию поворота тела.
  • Состояние. Состояние приседания это не только булевая переменная, это анимация и изменение высоты контроллера-коллайдера, но имеет смысл передавать лишь сам факт, триггер приседания, к которому клиент сам все пришьет.
  • Особые действа. Будь то выстрел или бафф, сервер конечно их не мониторит, они как правило тригеррят сопроцесс, абстрактно существующий от других. В нем отдельно просчитаются траектории, запустится таймер и потом выгрузятся из памяти, будто их и не было.
  • Физика. Весьма непредсказуемый аспект, который может крайне сильно нагрузить сервер в следствии обилия циферок. (Динамичное изменение векторов каждой из вершин коллайдера физически симулируемого объекта. А что если их несколько?)
    Расчеты для ragdoll-физики, например, всегда происходят на стороне клиента, как и разрушаемость зданий или составных объектов. Сервер пошлет лишь точку применения сил и их численное значение.

Как не надо

Допустим гениальный Вася из 5-Б, из найденных в интернете ассетов и обрывков кода сотворил свою MMORPG с фэнтезийным блэкджеком, грудастыми эльфийками и рейд-боссом математичкой.

Дабы пристально наблюдать за гриндящими кабанчиков одноклассниками, в центре королевства Вася воткнул замок и трон, но, увы, в "Wow killer starter pack" не нашлось анимации задумчивого восседания, пришлось делать самому.

Отныне каждый игрок сервера знал, когда Вася садится на трон, ибо каждый тик от сервера передавались положения и повороты каждой из косточек и вместо "Praise the Vasya" слышалась лишь отборная брань игроков с четырехзначным пингом.

2
2
Комментарии:  2
Ваш комментарий

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

Какая кстати сейчас игра с самым лучшим сетевым кодом?