From 77aa2c9a9dcdbf251277c60a25fbc1f5c3f2a592 Mon Sep 17 00:00:00 2001 From: James Turner Date: Mon, 21 Oct 2013 23:08:55 +0100 Subject: [PATCH] Smoother download rate from HTTP Crude filtering (low pass) of the download rate, over a 400msec time window. --- simgear/io/HTTPClient.cxx | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/simgear/io/HTTPClient.cxx b/simgear/io/HTTPClient.cxx index b3dbbf4a..4cc93f2f 100644 --- a/simgear/io/HTTPClient.cxx +++ b/simgear/io/HTTPClient.cxx @@ -789,17 +789,27 @@ void Client::receivedBytes(unsigned int count) unsigned int Client::transferRateBytesPerSec() const { unsigned int e = d->timeTransferSample.elapsedMSec(); - if (e < 400) { - // if called too frequently, return cahced value, to smooth out - // < 1 sec changes in flow + if (e > 400) { + // too long a window, ignore + d->timeTransferSample.stamp(); + d->bytesTransferred = 0; + d->lastTransferRate = 0; + return 0; + } + + if (e < 100) { // avoid really narrow windows return d->lastTransferRate; } unsigned int ratio = (d->bytesTransferred * 1000) / e; + // run a low-pass filter + unsigned int smoothed = ((400 - e) * d->lastTransferRate) + (e * ratio); + smoothed /= 400; + d->timeTransferSample.stamp(); d->bytesTransferred = 0; - d->lastTransferRate = ratio; - return ratio; + d->lastTransferRate = smoothed; + return smoothed; } } // of namespace HTTP -- 2.39.5