Колебание отправляемых значений - WinSock2

я делаю игру с использованием WinSock2 и sfml. Чтобы люди с большим пингом не задерживали её ход, я написал (взял с сайта) функцию, ждущую 3 милисекунды, после чего проверяющую, готов ли пользователь отправить данные. Если пользователь готов к отправке, то возвращается true, если не готов - false.

bool readyToReceive(int sock, int interval = 3)
{
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(sock, &fds);

    timeval tv;
    tv.tv_sec = 0;
    tv.tv_usec = interval;

    return (select(sock+1, &fds, 0, 0, &tv) == 1);
}

В функцию получения я добавил эту проверку

if (Clients[i].IsActive) {
                    char Clientbuffer[256];
                    if (readyToReceive(Clients[i].ClientSocket)) {
                        auto stat = recv(Clients[i].ClientSocket, Clientbuffer, sizeof(Clientbuffer), NULL); //Получаем байты
                        if (stat == SOCKET_ERROR)
                            break;
                        PackForSend PlayerPack = BytesToPack(Clientbuffer); //Байты в пакет
                        Clients[i].PosX = std::stoi(PlayerPack.getElement(0)[0]);
                        Clients[i].PosY = std::stoi(PlayerPack.getElement(1)[0]); // Достаём из пакета координаты игрока.
                        std::cout << "PosX = " << Clients[i].PosX << std::endl;
                    }
                    else
                        std::cout << "Poteren" << std::endl;

                }

Но вот беда - через некоторое время после включения клиента и хоста, координаты (даже если клиент не изменяет их) начинают колебаться - +-10 px, а сам ход игры начинает идти медленнее. При этом если мы проверку готовности заменим на true, то такой проблемы не будет.


Ответы (0 шт):