У меня есть 2-3 клиента, которые могут обмениваться сообщениями через Apple Game Center.
Единственная синхронизация, которая мне нужна, - это запустить игру одновременно.
Я предполагаю, что это включает синхронизацию часов. Как это сделать?
networking
multiplayer
game-center
GameCoder
источник
источник
now
и вы отправляете сообщение для запуска точно вnow + halfSecond
то время, пока все они получают сообщение в течение полсекунды и при условии, что их системные часы правильно синхронизированы, они все начнутся одновременно.Ответы:
Комментарий Стивена прав: теоретически это невозможно сделать.
К счастью, на практике вы можете приблизиться, как работает NTP .
Например, лучше, чем просто отправить сообщение 3 клиентам с надписью «начать сейчас», вы можете заранее обмениваться несколькими сообщениями ping, чтобы измерить время, необходимое для получения сообщения клиенту, и когда вы отправляете начальное сообщение, вместо «начать сейчас» произнесите «начать в Х миллисекундах» и настройте X на разное время, необходимое для получения сообщения.
например.:
Это не может гарантировать синхронизацию, потому что время, необходимое для отправки сообщения через Интернет, варьируется, и потому что оно может быть различным в каждом направлении. Первое, что вы можете уменьшить, выполнив измерения несколько раз и взяв среднее значение. Вторая сложнее, и ее теоретически невозможно решить (хотя сейчас я не могу вспомнить доказательства). Хорошей новостью является то, что вам, вероятно, не нужна такая большая точность.
источник
Как уже упоминалось, это невозможно, поэтому я бы попробовал другой подход:
Если у вас нет выделенного сервера, выберите одного участвующего клиента, чтобы стать хостом (это можно перенести, если возникнет такая необходимость).
Хозяин теперь будет выполнять всю важную игровую логику, такую как обнаружение попаданий, управление ИИ, обработка инвентаря и т. Д., А также отслеживание времени (то есть диктование времени игры).
Другие клиенты будут просто пытаться синхронизироваться с хостом, пытаясь оценить или приблизить ожидаемое значение. Если задержка увеличивается или происходит потеря пакетов, все может стать нестабильным, но догнать его тривиально, по сути, просто ждать следующего обновления.
Большинство игр (особенно FPS) скрывают этот факт, выполняя свои собственные локальные вычисления для собственного движения игрока, выстрелов и т. Д., Чтобы избежать ощущения задержки игры. Все по-прежнему исправляется на основе данных сервера. Это может привести к некоторой путанице, например, вы видите, как стреляете по врагу, но в тот же момент вы падаете замертво (без удара врага), но это все же гораздо лучший подход, чем полная синхронизация.
Если вы по-прежнему настаиваете на синхронизации всего, возможно, вы захотите создать какой-то счетчик шагов или кадров, чтобы все клиенты обрабатывали только один логический шаг, затем синхронизировали свои данные и т. Д. Имейте в виду, что это может быть как пропускная способность интенсивный, а также медленный, поэтому я бы не советовал делать это, если у вас нет большого количества данных, иначе ваш игровой процесс основан на пошаговом режиме (например, игры в стиле Artillery / Worms).
источник
Я рекомендую синхронизировать системные таймеры на всех клиентах и сервере с помощью протокола NTP [Stratum 2], затем сервер отправляет команду на запуск игры в указанное время, например, когда все таймеры достигают 0:05:00. Такой подход должен дать вам 3-4 мс точной синхронизации, я считаю.
источник