]> git.mxchange.org Git - simgear.git/commitdiff
Smoother download rate from HTTP
authorJames Turner <zakalawe@mac.com>
Mon, 21 Oct 2013 22:08:55 +0000 (23:08 +0100)
committerJames Turner <zakalawe@mac.com>
Mon, 21 Oct 2013 22:08:55 +0000 (23:08 +0100)
Crude filtering (low pass) of the download rate, over a 400msec
time window.

simgear/io/HTTPClient.cxx

index b3dbbf4a750df9f4bd8f66b61b6315fee359c5c7..4cc93f2f889e8a331780fa076692d5c72be14547 100644 (file)
@@ -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