Почему мультиплеер это 4x денег на разработку
Ну на самом деле не в 4 раза. Но в разы сложнее -- точно.
А что именно сложного-то? Вот сейчас я детально разберусь, разложу все по полочкам, так сказать. Расскажу, откуда берутся такие оценки. Все с цитатами, с цифрами, чтобы как у взрослых. Буду обо всем говорить в контексте Unreal Engine, так как программирую я на нем.
Почему мультиплеер сложно?
Сначала, в общем, о сложностях разработки мультиплеерной игры. Какие-то вещи вам покажутся очевидными, но назвать их все равно надо. Это мои субъективные суждения, ничем не подкрепленные (ха!) кроме собственного опыта.
- В синглплеере один мир, один компьютер. Не надо думать о состоянии игры. Менять это состояние можно прямо в блюпринтах (ну если привыкли к говнокоду). Костылить можно прямо в продакшене. Хотя какой в сингплеере продакшн. Ну короче, быстренько на коленке написали хот фикс и новое обновление в Steam готово. Игрок увидит игру так же, как видит ее разработчик. Почти всегда.
В мультиплеере же компьютеров, понятное дело, больше. Сервер и клиенты. Состояние игры хранится на сервере. Это состояние как-то надо передать на все клиенты. И все игроки должны видеть примерно одно и то же состояние. Значит надо все синхронизировать.
Ах-да, а еще Unreal Engine физика (Chaos, да PhysX такой же) недетерминированный. То есть мы будем подавать тот же инпут, и не факт, что получим тот же результат. - Так как мы имеем дело с сетью, то скорость и качество соединения у всех разная. У кого-то лагает, у кого-то пакеты теряются. А у нас все должно синхронизироваться. Значит надо оптимизировать. Фундаментально и на уровне АПИ. Проводить перформанс тесты. Обрабатывать обрывы соединения. Фундаментально -- то есть на уровне алгоритмов (например, Client-Side Prediction). На уровне АПИ -- используя инструменты, которые предлагает движок. В Unreal Engine очень много способов настройки мультиплеерного кода.
- Дальше -- читеры. Они есть всегда. Во-первых, нам нужно озаботиться, чтобы корректное состояние игра всегда хранилось только на сервере. Во-вторых, чтобы клиент не мог передавать невалидный инпут. В-третьих, интегрировать дорогие и сложные системы. И все равно продолжать получать жалобы игроков на читеров.
- Баги. Я люблю разрабатывать мультиплеерные игры. И поэтому испытаваю какое-то мазохистическое удовольствие фиксая баги мультиплеерные. Но зато какое потом удовлетворение. Часто пофиксать баг сложнее, чем добавить новую фичу.
Если подробнее, то в багах таких самое сложное - это их воспроизводить. У игроков в шиппинге никаких логов нет. Допустим, попадется какой-то добросовестный самаритянин, который распишет все подробно. Но, что если в релизе сотни игроков начнут злобно писать, что геймплей не работает без малейшего описания проблемы?
У QA (если они у вас есть ;) отдельная сложная задача. - Архитектура с самого начала. Нельзя взять и с кондачка писать мультиплеерную игру. Сделать быстренько прототип, по кайфу поиграть с друзьями, а потом добавлять функции. Скорее всего это будет в итоге провал. Надо сразу писать правильно. С самого начала выбирать: синглплеер или мультиплеер. Наверно, есть обратные примеры, но это скорее исключения. Напишите в каментах, кстати, если кто сталкивался.
- В мультиплеере (особенно в АА/ААА) UI намного сложнее. Больше анимаций. Больше 3Д-моделей. Например, FPS-шутеры. Как было в квейк-2? Игрок видит свои руки со стволом, другие игроки видят персонажа, который как дурак стрейфит по всему уровню. С тех пор ничего не изменилось. Все также надо в два раза больше арта, чтобы сделать мультиплеер.
Почему нельзя просто переделать сингл-плеер в мультиплеер, если понадобится?
На мой взгляд, это в принципе идиотская затея. Но давайте все-таки предположим. Вы сделали синглплеерную игру, зарелизились, и вдруг, игроки попросили сделать мультиплеер. Вполне реалистичный сценарий: No man's sky.
Они в итоге сделали это, но какой ценой! Сколько на них вылили хейта. Мультиплеер подвезли только в 2018. И даже сейчас он в игре самый базовый, без многих фич.
Я где-то читал или видел интервью с Шоном по поводу того, как они добавляли мультиплеер, но сейчас не нашел. Оставьте в каментах, если у кого есть ссылка.
Есть такая книга Code Complete Стива Макконела. Библия программиста. Есть там конечно, устаревшие вещи, но в целом я считаю, каждый программист должен ее прочитать.
Так вот в ней он дает оценку переделок:
Как это читать? Слева столбец -- на каком этапе проблема была заинтродюсена. По горизонтали, когда найдена. Ну и значения -- сколько будет стоить переделка.
Возьмем опять No man's sky. С самого начала они решили делать типа мультиплеерную игру -- на этапе требований все ок. Но вот на этапе архитектуры они конкретно залажали. Сделали какую-то ерунду с игроками в базе данных без возможности пересекаться друг с другом и видеть друг друга. После релиза им напихали. Они начали все переделывать. То есть ошибка по сути была найдена в стадии Post-Release. Считаем стоимость: переделка будет стоить в 25 раз больше чем, если бы они сразу начали делать по-настоящему мультиплеерную игру. Пара комментариев: во-первых, это всего лишь оценка; во-вторых, я думаю имеется ввиду оценка для полноценного мультиплеера. Конечно, на это надо смотреть, как говорят англичане, with a grain of salt. Но все-таки, относительные величины понятны. В конце концов, делали мульиплеер они же два года после релиза (2016-2018)
Давайте считать
В конце я хочу на примере сравнить мультиплеерную часть функционала и ту, которая отвечает чисто за клиентский код, то есть без привязки к сети. Сравнить по приблизительному объему кода. Наверно, можно добавить другие метрики, но я не знаю, какие.
Я, понятное дело, не могу показывать коммерческие проекты, в которых участвую по работе (NDA), поэтому буду разбирать свой пет-проект:
Итак, мультиплеер/тотал (в символах) = 40844/88925 = приблизительно 46 процентов. То есть только мультиплеерный код занимает половину проекта.
Далее, количество файлов мультиплеерных классов/всего = 17/34 = приблизительно 50 процентов.
Дополнительно нужно будет добавить код бэкенда, чтобы хранить профили игроков. Также стоимость оборудования для мультиплеерной игры. Это примерно -- компьютер для базы данных и бэкенда. А также виртуальная машина с дедиком, которая каждый раз будет подниматься для новой катки (бог знает сколько это будет стоить, у нас пока сервер создают игроки).
Вот так. Наверно, еще какие детали могу рассказать в комментариях.
p.s. Я решил с какой-то периодичностью писать про мультиплеер в Unreal Engine и в играх, в частности. Иногда про российскую игровую индустрию, поднимающуюся с колен. Иногда здесь, иногда на других площадках. Но только в моем тг-канале вы сможете быть в курсе всего. Подписывайтесь , когда наберется человек 500 подписчиков, я начну вам впаривать онлайн-курсы или еще какую дичь.