Когда я писал простой сервер для простой многопользовательской игры клиент ‹> сервер, я подумал о следующем текстовом протоколе с использованием библиотеки перевода. По сути, каждая команда имела определенное значение, например:
1 = character starts turning right
2 = character starts turning left
3 = character stops turning
4 = character starts moving forward
5 = character stops moving
6 = character teleports to x, y
Таким образом, клиент будет просто транслировать следующее, чтобы сообщить, что игрок теперь движется вперед и поворачивает направо:
4
1
Или, чтобы телепортироваться на 100x200:
6#100#200
Где # — разделитель параметров.
Соединение сокета будет связано с идентификатором игрока, так что никакой идентификатор не должен передаваться по протоколу, чтобы узнать, какому игроку принадлежит сообщение.
Конечно, все данные будут проверены на стороне сервера, но это другой вопрос.
Теперь это кажется мне довольно эффективным, всего 2 байта, чтобы сообщить серверу, что я двигаюсь вперед и поворачиваю направо.
Однако большинство «профессиональных» фрагментов кода, которые я видел, по-видимому, отправляли объекты или команды xml. Мне кажется, что для этого требуется гораздо больше ресурсов сервера, не так ли?
Является ли моя неопытная логика того, почему мой текстовый протокол будет эффективным, ошибочна? Или какой протокол рекомендуется для многопользовательских игр в реальном времени?
Я хочу настроить максимально эффективный протокол, потому что я не хочу использовать несколько кластеров/серверов для покрытия чрезмерной пропускной способности для моей многопользовательской 2D-игры, а также для предотвращения проблем и хлопот с синхронизацией.