Колебание отправляемых значений - 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, то такой проблемы не будет.