sadmadrus / chessBox

chessBox
Apache License 2.0
0 stars 0 forks source link

Надо выработать архитектурное понимание работы со временем #23

Closed nekr0z closed 1 year ago

nekr0z commented 1 year ago

Учёт времени — важный компонент современных шахмат.

Нам надо понимать, как мы будем работать со временем в партиях, и как мы будем его описывать. Это важно и для разработки сервиса сессий, и для сервиса логирования (#22 — хватит метки, или дополнительная информация нужна?)

Отдельный вопрос — будем ли мы пытаться в синхронизацию с клиентом, и как при этом обеспечивать целостность. Большинство современных решений используют довольно замороченные протоколы, чтобы «отвязать» время, которое есть у игрока на ход, от задержки, неизбежной при передаче хода по сети…

sadmadrus commented 1 year ago

Не простой вопрос. Сначала думал, что хватит временного штампа юниксового, но теперь не уверен.

sadmadrus commented 1 year ago

Этот вопрос мне все не дает покоя. Нагугливается что-то не внятное и к нашей проблеме имеющее весьма натянутое отношение. Вопрос в том насколько точно нужно определять время? Можно просто ограничиваться временными метками с клиента, а можно опираться на серверное время и вычислять время пинга до клиента

sadmadrus commented 1 year ago

А что если использовать две метки времени в формате Unix-time: сервера и клиента. Таким образом мы и пинг посчитаем от пользователя (игра на время) и учет времени организуем по серверному времени, поскольку большая часть вычислений проводится на сервисах. Потом опять же можно будет раскатать по отчетам скорости ответов сервисов

nekr0z commented 1 year ago

две метки времени в формате Unix-time: сервера и клиента

А если нет гарантии, что часы на сервере и клиенте синхронизированы? (А её ведь нет! Больше того, я нарочно у себя скрипт напишу, который будет системные часы на минуту назад каждый ход переводить, чтобы времени больше оставалось.)

Хорошо бы вкурить, как это устроено у взрослых. Кто-нибудь умеет читать на C?

sadmadrus commented 1 year ago

две метки времени в формате Unix-time: сервера и клиента

А если нет гарантии, что часы на сервере и клиенте синхронизированы? (А её ведь нет! Больше того, я нарочно у себя скрипт напишу, который будет системные часы на минуту назад каждый ход переводить, чтобы времени больше оставалось.)

Хорошо бы вкурить, как это устроено у взрослых. Кто-нибудь умеет читать на C?

Ну и переводи себе. Игра идет по сервернуму времени :) Но идею я понял

nekr0z commented 1 year ago

Игра идет по сервернуму времени

Сервер будет думать, что у меня растёт пинг, а я-то буду тратить это время на анализ позиции :)

Тут, кстати, есть ещё связанная технологическая проблема в рамках #45 — от какого времени отсчитывать начало размышления над ходом.

sadmadrus commented 1 year ago

Игра идет по сервернуму времени

Сервер будет думать, что у меня растёт пинг, а я-то буду тратить это время на анализ позиции :)

Тут, кстати, есть ещё связанная технологическая проблема в рамках #45 — от какого времени отсчитывать начало размышления над ходом.

почитал тут немного про эти синхронизации. Можно опираться на собственный таймер на сервере

nekr0z commented 1 year ago

почитал тут немного про эти синхронизации. Можно опираться на собственный таймер на сервере

Опираться всё равно придётся на собственный таймер сервера, конечно — хотя бы потому, что другим нельзя верить.

Но как-то предусмотреть, чтобы с мобильника или, например, со спутниковым интернетом игра не превращалась в боль, хочется.

sadmadrus commented 1 year ago

почитал тут немного про эти синхронизации. Можно опираться на собственный таймер на сервере Опираться всё равно придётся на собственный таймер сервера, конечно — хотя бы потому, что другим нельзя верить. Но как-то предусмотреть, чтобы с мобильника или, например, со спутниковым интернетом игра не превращалась в боль, хочется.

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

nekr0z commented 1 year ago

По итогам обсуждений в других местах предлагаю зафиксировать примерно такую концепцию:

  1. Учёт времени, затраченного на ход, ведёт сервис игры (игровой сессии); время, затраченное на ход, считается как промежуток времени между отправкой информации об ожидании хода (т. е. о том, что соперник сделал ход) гейту и получением от гейта информации о сделанном ходе.
  2. Гейт может сообщить свою версию времени, затраченного на ход (время между отправкой информации от гейта клиенту и получением хода от клиента гейтом), тогда сервис игры учтёт это время в качестве затраченного на ход (гейт мы контролируем и доверяем ему).
  3. При желании, можно будет потом замутить синхронизацию по подобию timeseal на уровне гейта.