Разработка шаблонов предложений для синхронизации многопользовательских данных в онлайн-игре в режиме реального времени - PullRequest
5 голосов
/ 20 августа 2011

Я работаю над проектом по изучению node.js и искал несколько советов о том, как обрабатывать синхронизацию пользовательских данных в режиме реального времени.

Допустим, у вас есть двухмерная прямоугольная карта (примерно 600x400), в которой количество игроков занимает x, y позиций на этой карте. Каждый пользователь может перемещаться с помощью клавиш со стрелками и взаимодействовать с другими в некотором основном виде. Учитывая, что это будет воспроизводиться по протоколу HTTP, каков будет наилучший шаблон проектирования с точки зрения обработки и синхронизации пользовательских данных для обеспечения максимально плавного и динамичного взаимодействия?

Я могу придумать несколько вариантов, но буду признателен за еще несколько идей / уточнений:

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

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

  3. Смесь двух, но вместо использования (x, y) координат мы используем вектор [предыдущие x / y и время, текущий x / y и время, предложенные x / y во время интервал], который затем можно использовать для рисования путей снаряда, которые постоянно смещаются. Кажется, что это было бы сложно реализовать.

Есть указатели?

1 Ответ

5 голосов
/ 20 августа 2011

В большинстве игр используется некая форма отсчета http://en.wikipedia.org/wiki/Dead_reckoning, которая допускает отложенные обновления, распространяемые с сервера, но сохраняет некоторую иллюзию обновлений в реальном времени на клиенте.

Лучший вариант - 3. Он не особенно сложен - просто отслеживайте, где вы ожидаете, что каждый актер будет основан на механике игры, и когда вы получаете обновление от сервера, вы приводите два состояния в соответствиечерез некоторое время.

Если вы обнаружите, что сервер отправляет вам состояние, которое слишком далеко от состояния, которое принимает ваш клиент (слишком далеко нужно определить), то вы можете просто перейти к состоянию сервера и принять разрыв на клиенте,

...