Перейти к основному содержимому
🎉 GP CONF 2026: Конференция о рынке WEB-игр 👾 23 сентября | Подробнее

Мультиплеер

Концепция

  • Модуль мультиплеера синхронизирует игру в реальном времени между игроками, находящимися в одном канале GamePush.
  • Канал используется как игровая комната. Все игроки, подключившиеся с одинаковым channelId, попадают в одну мультиплеерную сессию.
  • Перед подключением к мультиплееру игрок должен стать участником канала.
  • SDK автоматически выбирает хоста и переносит эту роль, если текущий хост отключился.
  • Состояния игроков, состояние общего мира и одноразовые игровые события синхронизируются отдельно.
  • SDK автоматически буферизует и интерполирует обновления состояния.
  • Доступны два режима синхронизации: fast с меньшей задержкой и smooth с более плавным движением.

Хост и пиры

Мультиплеер использует модель Host/Peer:

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

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

При выборе хоста учитываются стабильность соединения, время в комнате и пинг. Не назначайте постоянного хоста в коде игры. Проверяйте gp.multiplayer.isHost и обрабатывайте события becameHost и becamePeer.

info

Выбор хоста происходит после подключения и может занять несколько секунд. Не считайте значение gp.multiplayer.isHost окончательным сразу после выполнения connect().

Выбор механизма синхронизации

Для разных типов данных предусмотрены три механизма:

МеханизмДля чего использоватьПримеры
Состояние игрокаДанные, которыми управляет отдельный игрокКоординаты, направление, анимация, здоровье
Глобальное состояниеОбщие сущности и правила, которыми управляет только хостВраги, предметы, таймер раунда, общий счёт
СообщенияОдноразовые действия, которые не требуется хранить как состояниеВыстрел, взрыв, эмоция, нажатие кнопки

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

Режимы синхронизации

Режим определяет tick rate и размер буфера интерполяции для состояния игроков и глобального состояния.

Fast

gp.multiplayer.setMode('fast');
  • 60 тиков в секунду;
  • буфер интерполяции 50–100 мс;
  • меньшая задержка и больший сетевой трафик;
  • подходит для экшенов, шутеров и гонок.

Smooth

gp.multiplayer.setMode('smooth');
  • 20 тиков в секунду;
  • буфер интерполяции 100–300 мс;
  • более плавная работа при нестабильном соединении и меньший сетевой трафик;
  • подходит для стратегий, настольных и более медленных игр в реальном времени.

Конфигурация SDK по умолчанию соответствует режиму smooth.

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

Схемы состояния

Состояние игроков и глобальное состояние используют одинаковые настройки полей:

{
x: { interpolate: true },
hp: { interpolate: false },
color: { readonly: true },
}
  • interpolate: true плавно изменяет числовое значение между полученными снимками.
  • interpolate: false применяет последнее значение без интерполяции.
  • readonly: true отмечает начальные данные, которые не должны изменяться последующими обновлениями состояния.

Схемы могут содержать вложенные объекты и массивы объектов:

gp.multiplayer.defineGlobalSchema({
enemies: {
id: { readonly: true },
x: { interpolate: true },
y: { interpolate: true },
hp: { interpolate: false },
},
});

SDK поддерживает jitter buffer и автоматически интерполирует или кратковременно экстраполирует синхронизируемые числовые поля. Игровой код получает готовое состояние без собственной реализации сетевой интерполяции.

Игровая логика и отрисовка

Используйте onTick() для игровой логики, а requestAnimationFrame() — для отрисовки:

function gameTick(delta) {
updateGame(delta);
}

function render() {
drawGame();
requestAnimationFrame(render);
}

gp.multiplayer.onTick(gameTick);
requestAnimationFrame(render);

Цикл тиков SDK продолжает работать, когда вкладка браузера находится в фоне. Отрисовку можно оставить привязанной к requestAnimationFrame().

Как начать

  • Создайте или выберите канал для игровой комнаты.
  • Добавьте всех игроков в канал.
  • Подпишитесь на события мультиплеера и подключитесь по ID канала.
  • Определите схемы состояния игроков и общего мира.
  • Выберите режим синхронизации и запустите игровой цикл.

Перейти к подробной документации по мультиплееру 👇

Оставайтесь на связи

С другими документами раздела вы можете ознакомиться здесь. Для начала работы с GamePush ознакомьтесь с нашими туториалами.

Сообщество GamePush в Telegram: @gs_community.

Для ваших обращений e-mail: official@gamepush.com

Желаем вам успехов!