Я новичок в разработке игр и изучаю многопользовательские игры. Я заметил, что всегда есть некоторая задержка, игроки всегда получают обновления от прошлых действий. Но есть методы, такие как мертвая расплата, чтобы справиться с задержкой. Я могу предсказать движение и сделать движения плавными. Но как бы заставить синхронизировать действия, такие как прыжки, остановка ходьбы и т. Д.
Предположим, что клиент А двигался, он был на 100 м в 10,2 раза со скоростью 100 м / с и отправил эту информацию. Клиент Б получит эту информацию несколько позже, пусть это будет 10.4. Поэтому на клиенте B я могу использовать прогнозирование и разместить клиента A на расстоянии 120 метров. Но что, если клиент сделал прыжок на 110 м в 10.3. Я не могу предсказать это, и так как я использовал предсказание, я не могу показать, как клиент А прыгал в прошлое.
Я могу справиться с этой проблемой, вообще не отправляя прыжковое действие. Но что если в моей игре есть пустоты, в которых игроки могут упасть и умереть? Итак, если я не синхронизирую действия прыжка, другие игроки заметят, что бегал один игрок, тогда он падает в пустоту, а затем снова появляется на экране, разрушая визуальное сражение.
Прыжок является лишь примером, может быть много сценариев, когда предсказание не может работать. Итак, как с ними бороться. Одним из таких примеров могут быть многопользовательские игры на арене сражений, такие как Awesomenauts.
источник
Ответы:
Мертвая расплата не может быть лучшей идеей в этом случае; Вы должны выполнить интерполяцию сущностей (эффективно рендерить других игроков в прошлом, что всегда дает вам реальные, действительные позиции). Я написал об этом гораздо подробнее здесь . Приемлемо или нет незначительное наблюдение игроков в прошлом, зависит от деталей того, что вы пытаетесь сделать.
источник
Существует довольно подробное описание исходного движка. Казалось бы, часть соответствующего исходного кода также доступна как часть Source SDK.
https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Он использует ряд методов, чтобы попытаться справиться с задержкой в сети в модели сервер-клиент. Похоже, что основным моментом является то, что локальный клиент обрабатывает ввод и другие события локально, как если бы не было сервера, а затем рассматривает возможность того, что сервер скажет, что клиент позже сделал это неправильно.
источник