Синхронизация времени по сети в C ++ - PullRequest
0 голосов
/ 12 октября 2019

Я моддинг игры (Портал 2). Я хочу добавить функцию обратного отсчета, чтобы начать гонку.

Используя библиотеку SFML, я посылаю time_since_epoch из system_clock на локальный компьютер и удаленный через сокеты. Как только он получен, я сравниваю полученный time_since_epoch и тот, который задан функцией now().

, чтобы я мог получить время, затраченное сокетом для отправки сообщения, которое должно быть текущимping (~ 4 мс).

Отлично работает на том же компьютере, на котором работает сервер. Тем не менее, это дает мне очень большое число на отдаленном. Вот мой код:

На стороне сервера:

void NetworkManager::StartCountdown()
{
    sf::Uint64 epoch = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now()).time_since_epoch().count();

    sf::Packet countdown_packet;
    countdown_packet << HEADER::COUNTDOWN << epoch;
    for (auto& socket : this->socket_pool) {
        socket->send(countdown_packet);
    }
}

На стороне клиента:

void NetworkGhostPlayer::Countdown(sf::Uint64 epoch)
{
    //std::this_thread::sleep_for(std::chrono::milliseconds(4));
    auto now = std::chrono::system_clock::now();
    auto diff = std::chrono::time_point_cast<std::chrono::milliseconds>(now).time_since_epoch().count() - epoch;
    console->Print("%lld\n", diff);
}

Countdown() isвызывается после получения пакета и информации в нем. console->Print() - это функция Portal 2 для печати в игровой консоли. Портал 2 выполняет клиентскую часть.

На локальном компьютере консоль печатает 0. Но на дальнем он дает числа от 300 до 1000. Я, хотя это было связано с пингом, который имеет ~ 4 мс, но я проверил на локальном компьютере со строкой std::this_thread::sleep_for(std::chrono::milliseconds(4));, и вывод был 4, как ожидалось.

Я не понимаюв чем проблема. Если я запускаю сервер на другом компьютере, то новый локальный игровой экземпляр выдаст 0, а новый удаленный - большое число.

Оба компьютера работают в Windows. Вот полный код плагина: https://github.com/Blenderiste09/SourceAutoRecord/blob/Network-ghosts/GhostServer/NetworkManager.cpp

и

https://github.com/Blenderiste09/SourceAutoRecord/blob/Network-ghosts/src/Features/Demo/NetworkGhostPlayer.cpp

Большое спасибо за вашу помощь!

Blenderiste09

...