Варианты мультиплеера
При разработке мультиплеера для Godot выбор архитектуры определяет задержки, защиту от читов и стоимость инфраструктуры. За 2025–2026 годы наиболее употребимыми подходами остаются клиент-серверная модель с авторитетным сервером (authoritative server), peer-to-peer для локальных игр, и модели с WebSocket/ENet для веб- и кроссплатформенных проектов.
- Client-server (authoritative) — сервер хранит «истину» мира; клиенты отправляют ввод. Подходит для соревновательных игр; средняя задержка target 30–100 мс; нагрузка на сервер растёт линейно с числом игроков.
- Peer-to-peer — клиенты синхронизируют состояние друг с другом; минимальные серверные затраты, но большие риски читинга и высокой латентности для географически распределённых игроков.
- WebSocket — TCP-подключение через браузер или Godot WebSocketClient; удобно для веб-версий и мобильных клиентов; обеспечивает надёжную доставку, но чувствительно к конгестии и задержкам при потере пакетов.
- ENet (UDP) — низкоуровневая библиотека-пакет для Godot; подходит для игр с высокой частотой обновлений (тикрейты 30–60 Hz), даёт меньшую задержку за счёт UDP и ручной реализации подтверждений и повторных отправок.
- WebRTC — для P2P в браузерах; сложнее конфигурация, полезно для голосовой связи и прямого обмена данными между игроками.

Архитектура WebSocket соединения для Godot
Шаг 1: high-level networking
За 2026 год в Godot 4 стабильна система High-Level Multiplayer для ENet, но если нужен браузерный клиент — WebSocket остаётся рабочим выбором. Здесь покажу практику с WebSocketClient в GDScript и объясню сообщения, формат и частоту обновлений.
1.1. Выбор частоты и формата сообщений
- Целевой тикрейт: 20–30 Hz для игр с позиционным синхронизированием; 60 Hz для fast-action (при использовании ENet/UDP).
- Формат: JSON для скорости разработки, бинарный PackedByteArray или protobuf для экономии трафика. JSON-протокол обычно добавляет ~200 байт на пакет в сравнении с бинаром.
- Размер пакета: держите snapshot ≤ 800 байт для одного игрока при 30 Hz. При 30 Hz и 800 байт: ~24 KB/s на игрока.
1.2. Пример клиента на GDScript (WebSocketClient)
# client.gd
extends Node
var ws = WebSocketClient.new()
var server_addr = "wss://play.example.com:443/ws" # используйте wss для TLS
var tickrate = 30 # Hz
var input_buffer = []
func _ready():
ws.connect_to_url(server_addr)
set_process(true)
func _process(delta):
ws.poll()
func _on_ws_connected():
print("connected")
# отправляем идентификацию
ws.get_peer(1).put_packet(to_json({"t":"auth","token":"PLAYER_TOKEN\
Комментарии (0)
Войдите или зарегистрируйтесь, чтобы оставить комментарий
Загрузка комментариев…