X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fnet%2Fnet.cpp;fp=src%2Fnet%2Fnet.cpp;h=59176aac8251edcf5f18876d65060ccb80093657;hb=c256dca7c6ca2c7f8eeffae53c02fe62bd892198;hp=9b50479b135445ae0225a28f98653fee18c6f000;hpb=51fda2c924eaa28082adeb875f93d4715f881b15;p=blank.git diff --git a/src/net/net.cpp b/src/net/net.cpp index 9b50479..59176aa 100644 --- a/src/net/net.cpp +++ b/src/net/net.cpp @@ -84,6 +84,10 @@ uint16_t Connection::Send(UDPpacket &udp_pack, UDPsocket sock) { throw NetError("SDLNet_UDP_Send"); } + if (HasHandler()) { + Handler().PacketSent(seq); + } + FlagSend(); return seq; } @@ -151,20 +155,37 @@ uint16_t Connection::SendPing(UDPpacket &udp_pack, UDPsocket sock) { ConnectionHandler::ConnectionHandler() : packets_lost(0) , packets_received(0) -, packet_loss(0.0f) { +, packet_loss(0.0f) +, stamp_cursor(15) +, stamp_last(0) +, rtt(64.0f) { + Uint32 now = SDL_GetTicks(); + for (Uint32 &s : stamps) { + s = now; + } +} +void ConnectionHandler::PacketSent(uint16_t seq) { + if (!SamplePacket(seq)) { + return; + } + stamp_cursor = (stamp_cursor + 1) % 16; + stamps[stamp_cursor] = SDL_GetTicks(); + stamp_last = seq; } void ConnectionHandler::PacketLost(uint16_t seq) { OnPacketLost(seq); ++packets_lost; UpdatePacketLoss(); + UpdateRTT(seq); } void ConnectionHandler::PacketReceived(uint16_t seq) { OnPacketReceived(seq); ++packets_received; UpdatePacketLoss(); + UpdateRTT(seq); } void ConnectionHandler::UpdatePacketLoss() noexcept { @@ -176,6 +197,27 @@ void ConnectionHandler::UpdatePacketLoss() noexcept { } } +void ConnectionHandler::UpdateRTT(std::uint16_t seq) noexcept { + if (!SamplePacket(seq)) return; + int diff = HeadDiff(seq); + if (diff > 0 || diff < -15) { + // packet outside observed time frame + return; + } + int cur_rtt = SDL_GetTicks() - stamps[(stamp_cursor + diff + 16) % 16]; + rtt += (cur_rtt - rtt) * 0.1f; +} + +bool ConnectionHandler::SamplePacket(std::uint16_t seq) const noexcept { + // only sample every eighth packet + return seq % 8 == 0; +} + +int ConnectionHandler::HeadDiff(std::uint16_t seq) const noexcept { + int16_t diff = int16_t(seq) - int16_t(stamp_last); + return diff / 8; +} + ostream &operator <<(ostream &out, const IPaddress &addr) { const unsigned char *host = reinterpret_cast(&addr.host);