Многопользовательская игра в реальном времени (концептуальный вопрос)

Я читал эту статью от Valve, которая, кажется, объясняет архитектуру их многопользовательской системы. Кажется, что они задерживают рендеринг на пару тиков на клиенте, чтобы они могли обрабатывать отброшенные пакеты, но они также отправляют пакеты как «дельта-снимки» (разница между двумя соседними состояниями).

Предположим, у нас есть моменты времени A, B, C, и клиент прав в момент времени A, но отбрасывает пакет в момент B, а затем получает его в момент C. Как он может правильно определить состояние в момент времени C? Пакет в C только сообщает (я думаю) дельту между состояниями B и C, а клиент знает только состояние в A. Что я здесь упускаю?


person Jesse Beder    schedule 23.12.2008    source источник
comment
Это не в режиме реального времени в ‹a href=en.wikipedia.org/wiki/ Вычисления в реальном времени›обычного смысла‹/a›.   -  person andersoj    schedule 10.04.2009


Ответы (6)


Дельты не обязательно должны относиться к предыдущему отправленному сообщению (дельта или моментальный снимок). Вместо этого они будут относиться к последнему состоянию подтвержденного. Таким образом, в приведенном выше примере обновление в C может быть дельтой по сравнению с A. Таким образом, потеря сообщения B становится неудобством, поскольку дельты становятся больше (и, возможно, накапливается ошибка), но в конечном итоге сообщение будет доставлено и подтверждено, и сервер может начать отправлять дельты относительно этого обновленного состояния.

person Kylotan    schedule 01.06.2009

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

У Гленна Фидлера есть несколько отличных статей о сетевых играх на его блог.

Эта старая статья о сети в Quake 3 звучит похоже. Дельта-состояния представляют собой изменения по сравнению с последним подтвержденным состоянием клиента, которое было получено. Итак, если сервер видит, что клиент отстает, то следующая дельта будет создана из разницы между состоянием клиента и текущим состоянием сервера.

person Judge Maygarden    schedule 23.12.2008

Не глядя на реализацию, я бы предположил, что пакет C также включает в себя идентификатор пакета, из которого он является дельтой (в данном случае, пакета B).

Когда клиент получает пакет C после пакета A, он будет знать, что он еще не видел пакет B, и, следовательно, может запросить полное обновление с сервера.

person Andrew Rollings    schedule 23.12.2008
comment
Разве это не предполагает, что дельта B имеет то же содержание, что и дельта C? - person Andrew Rollings; 24.12.2008
comment
Либо идентификатор пакета, из которого он состоит, либо порядковый номер, либо какой-либо другой простой способ отслеживать порядок пакетов... - person Marcin; 24.12.2008
comment
Ну, обычно пакеты имеют метку времени и порядковый номер. Это делает возможной точную интерполяцию между пропущенными пакетами. - person Andrew Rollings; 24.12.2008
comment
Но в статье говорится: «... интерполяция будет работать даже в том случае, если моментальный снимок [B] будет отсутствовать из-за потери пакетов — это, по-видимому, указывает на то, что полное обновление с одним потерянным пакетом не требуется. - person Jesse Beder; 25.12.2008
comment
Ага. Я уверен, что дельта будет достаточно мала, чтобы интерполяция была в порядке. Просто это будет менее точно. Вероятно, они также используют алгоритмы прогнозирования, основанные на вероятном спроецированном пути объекта, чтобы «синтезировать» положение B для интерполяции. Quake 3 многое сделал в этой области. - person Andrew Rollings; 25.12.2008

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

person Jimmy    schedule 23.12.2008

Из связанной статьи:

Обычно полные (не дельта) снэпшоты отправляются только при запуске игры или когда клиент страдает от сильной потери пакетов в течение нескольких секунд. Клиенты могут запросить полный снимок вручную с помощью команды cl_fullupdate.

person RSlaughter    schedule 23.12.2008
comment
Да, но это говорит о сильной потере пакетов в течение нескольких секунд. Ни единой потери пакетов, от которой он явно указывает, что может восстановиться. - person Jesse Beder; 24.12.2008

Сервер, вероятно, отправляет полную синхронизацию (то есть не дельты) периодически, но реже. Это то, что я делаю, по крайней мере.

person ggambett    schedule 23.12.2008