Передаются ли огромные статические объекты, такие как среда, от сервера к клиенту в современных многопользовательских играх?

18

У меня есть авторитетная система, где, когда игрок присоединяется к матчу, он получает все уже порожденные объекты - порожденные собой (клиент).

Это выглядит так:

  1. Client отправляет токен доступа Server
  2. Client получает согласие от Server
  3. Client переключает сцену на игровую сцену
  4. Serverотправляет игроков, ящики, объекты, с которыми вы можете взаимодействовать, чтобы они clientмогли появляться и отображать их.

Но как насчет наземного объекта? На данный момент у меня точно такая же сцена на сервере и клиенте - одна статическая плоскость действует как пол. В настоящее время я добавляю новые вещи, деревья, лестницы и собираю вещи вместе.

Я думал - у нас все хорошо. Но разве среда не должна быть синхронизирована? Как-нибудь быть в сети? Принадлежит серверу?

Давайте возьмем League of Legends:

введите описание изображения здесь

Это статичная среда, вероятно, одна комбинированная сетка (лестница, трава, стены, магазин). Но действительно ли он хранится на клиенте или он отправляется сервером во время экрана загрузки?

Иаков
источник
1
Вы даже можете подумать об этом с точки зрения того, что вы можете добавлять собственные скины для персонажей лиги и окружения. Вы не отправляете их на сервер, они отображаются локально, поэтому имеет смысл прийти к выводу, что они хранятся и отображаются локально. Кроме того, они не влияют на игровой процесс, если вы спрашиваете о столкновениях, они представляют собой смесь сервера и клиента, так что игрок не может обманывать и проходить сквозь стены.
Candid Moon _Max_

Ответы:

41

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

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

В определенных случаях мелкие активы могут передаваться целиком, если актив как-то считается «спойлером» или чем-то еще. Но это необычно. Обычно вы видите, что игра может загружать новый контент из патча или чего-то еще, но это произойдет только один раз, во время процесса патча при запуске. Не во время игры.


источник
21
Обратите внимание, что этот ответ касается только статических активов. Динамические / сгенерированные игроком ресурсы (например, куски мира Minecraft или логотипы гильдий MMORPG, которые игроки могут загрузить) должны быть переданы. Но даже тогда обычно пытаются минимизировать объем необходимых данных (чтобы продолжить пример Minecraft: отправка обновлений блока вместо целых кусков, только указание типа / состояния блока и координат, которые изменились) и / или кэширование данных на стороне клиента ,
hoffmale
@hoffmale Да, хорошая мысль; В вопросе говорилось, что пейзаж в конце был статичным, поэтому я не думал поднимать этот вопрос, но он хороший.
3
Если актив является спойлером, обычно актив находится на клиенте в зашифрованном виде, и ключ дешифрования передается с сервера клиенту, когда актив необходим.
Грант Дэвис
4
И, например, если вам нужно случайным образом разместить деревья на карте, вместо того, чтобы отправлять координаты деревьев клиенту, он отправляет начальное число (генератора случайных чисел) клиенту.
Грант Дэвис
5

Зависит от нескольких факторов, в том числе от типа игры (я предполагаю RTS здесь, хотя MMO с открытым миром также приходит на ум). Базовое местное местное состояние игрока передается по соединению или является частью активов клиента - например, игра RTS, в которой карта либо поставляется вместе с клиентом, либо загружается до начала игры.

Действительно, меш обычно не отправляется, как это было бы на клиенте в большинстве случаев RTS. Независимо от того, есть ли карта столкновений, что действительно важно для синхронизации этих двух отправлена , - это другой вопрос. Но в большинстве RTS это снова будет предварительно сохранено на клиенте.

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

После этого есть несколько типичных способов синхронизации:

  • Дельты отправляются клиенту - самый распространенный и эффективный способ поддерживать локальный / клиентский мир в актуальном состоянии с помощью сервера;
  • Контрольные суммы иногда отправляются либо с сервера на клиент, либо с клиента на сервер, чтобы убедиться, что состояние мира действительно совпадает;
  • Иногда полное состояние повторно посылается для повторной синхронизации клиента - часто в результате технических проблем, таких как дрейф с плавающей запятой.
инженер
источник
4

Что касается вашего точного вопроса, который я задал, я не знаю, как конкретно Лига Легенд решит его. Я никогда не играл в эту игру, поэтому я не могу предположить, нужно ли это.

Но ответ на ваш вопрос, в целом, довольно прост и понятен:

Если данные статичны , и вы точно знаете , что они будут никогда не изменятся ( не периодических полных обновлений игры, но это отдельно), то зачем вам когда-нибудь отправлять эти дополнительные данные? Обычно вы пытаетесь избежать отправки того, чего можно избежать. Отправляйте данные только в том случае, если это сообщение необходимо .

С другой стороны, если данные со временем изменятся или вы просто захотите оставить эту опцию открытой, то действительно ли у вас есть выбор? Для этого случая вы должны отправить данные. В противном случае клиент не имеет того, что ему нужно.

Это относится ко всем сетевым коммуникациям, а не только к данным о местности. Все .

Аарон
источник
2

Нет.

Я сделал все возможное, чтобы покопаться в источнике League of Legends и обо всем, включая модели Чемпионов, Лавочника, общий фон карты и пуховых существ, добавленных после свершившегося факта (как маленькая белка на некоторых камнях и улитка в реки) хранятся на стороне клиента. Тот факт, что клиент имеет все эти модели, является одной из причин, по которой LoL имеет размер в несколько гигабайт.

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

Так как же это решить тогда? Каждый игрок просто отправляет только те данные, которые имеют значение для других на сервер игроков в игре. Никто не должен знать, осталось ли у вас 5 секунд на восстановление Q, или что Deep Terror Thresh Skin создает для вас пузыри. Вещи, которые проходят в игре, такие как: В'Коз бросил Q, Виктор переместился влево и т. Д.

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

НОТА:

Если вы хотите посмотреть, что у клиента есть, и, следовательно, сервер не пропустит вас, найдите папку C: \ Riot Games \ RADS \ lol_Game_Client \ Projects (это может быть немного не так, извините меня, я '' я сейчас работаю с памятью) и найду распаковщик .RAF-файлов онлайн. Затем вы можете увидеть все вещи, которые размещены локально, такие как загрузка экрана и текстуры кожи, даже скелеты чемпионов.


источник
1
Кажется, что очевидный способ реализовать это состоит в том, чтобы запросить у клиента (от выделенного ресурса-сервера) любые активы, которые он еще не сохранил локально, и когда он их получает, он добавляет их (частично) навсегда к своему локальное постоянное хранилище на диске. Таким образом, ресурсы загружаются только один раз и только тогда, когда они действительно необходимы. (Как только это сработает, оптимизация будет состоять в том, чтобы предварительно заполнить локальный магазин клиента активами, которые, скорее всего, понадобятся. Это сократит время запуска игры при первом подключении за счет увеличения пакета установщика игры)
Джереми
1
@JeremyFriesner Почему это так очевидно? Это звучит хуже, чем текущая реализация, описанная в этом посте, в которой вы устанавливаете все ресурсы заблаговременно, чтобы они были немедленно доступны, когда они вам нужны. Это может сработать для одиночной игры, хотя я думаю, что многие люди предпочли бы более длительное время установки (и больше дискового пространства), чем необходимость постоянно ждать загрузки новых ресурсов во время игры.
Энтони Грист,
2
Для многопользовательской игры? Абсолютная катастрофа. Вы не хотите заставлять всех остальных игроков ждать начала игры, потому что один человек должен загрузить некоторые ресурсы, которые ему никогда не нужны до сих пор.
Энтони Грист,
1
@AnthonyGrist Вот почему во многих играх, таких как Лига Легенд, игрок должен загрузить все игровые ресурсы перед тем, как присоединиться к очереди, чтобы найти совпадение. Это работает намного лучше, чем задержка игры, пока вы ждете, когда сработает большой актив. Имейте в виду, что в этом роде игры игроки воодушевляются снижением пинга на 10 мс, и часто играют с пингом <50 мс и могут определить, перепрыгнул ли он в диапазон от 100 до 150. Ожидание получения ресурса во время игры будет катастрофой для MOBA или FPS, и если это произойдет в неподходящее время, это может даже изменить результат игры.
JustWannaFly
@AnthonyGrist (продолжение) Я думаю, вы могли бы подумать об этом так. В некоторых многопользовательских / конкурентных играх игроки тратят больше времени на загрузку / исправление / установку для более реалистичного игрового процесса, когда клиент заботится обо всех обновлениях и входе в очередь. Это делает так, что только конкретному игроку, нуждающемуся в активах, приходится ждать, если он (и) не хочет присоединиться к заранее подготовленной группе, тогда всем игрокам в группе придется ждать, чтобы войти в очередь, чтобы найти противников
JustWannaFly
1

Примером того, где это не было сделано, был Elder Scrolls Online, где он доверял клиенту высоту над уровнем земли .

Золотодобытчики упали с уровня земли на несколько футов. Затем они могли бы ходить "под" местностью и добывать ресурсы снизу, не будучи замеченными ПК или атакованными NPC.

Подобные изменения позволили им сгладить скалы, чтобы они могли подниматься по ним, удалять или прокладывать под статичными стенами, видеть сквозь все статические объекты и т. Д.

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

Однако в играх на основе тайлов, таких как Furcadia, все по-другому: каждая клетка, в которую вы входите, обладает степенью защиты на стороне сервера, и серверу не нужно никому доверять клиенту: сервер знает и проверяет каждое движение и действие пользователя, и клиент отображает действие только тогда, когда сервер сообщает ему результат.

Деви Морган
источник
1
TL; DR: Всегда предполагайте, что клиент лжет, обманывает, дрофа . Но проверка всего сервера снижает вашу емкость.
Draco18s