From 65b51b8d9155f72fd8eb61662d5a4d0eccbdbfd2 Mon Sep 17 00:00:00 2001 From: Torsten Dreyer Date: Wed, 26 Oct 2016 11:02:24 +0200 Subject: [PATCH] Limit the update rate of the property change websocket Of fast systems with 60fps sending many properties to web clients may overrun the rendering capabilities of the browser. At some point the web socket client halts the simulation by throtteling the network connection. Update rate is settable at startup setting to a double value /sim/http/property-websocket/update-interval-secs (default: 0.05 aka 20Hz) --- src/Network/http/PropertyChangeWebsocket.cxx | 16 ++++++++++++++-- src/Network/http/PropertyChangeWebsocket.hxx | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/Network/http/PropertyChangeWebsocket.cxx b/src/Network/http/PropertyChangeWebsocket.cxx index c1c23b516..0c70061f1 100644 --- a/src/Network/http/PropertyChangeWebsocket.cxx +++ b/src/Network/http/PropertyChangeWebsocket.cxx @@ -118,7 +118,10 @@ static void handleExecCommand(cJSON* json) } PropertyChangeWebsocket::PropertyChangeWebsocket(PropertyChangeObserver * propertyChangeObserver) - : id(++nextid), _propertyChangeObserver(propertyChangeObserver) + : id(++nextid), + _propertyChangeObserver(propertyChangeObserver), + _minTriggerInterval(fgGetDouble("/sim/http/property-websocket/update-interval-secs", 0.05)), // default 20Hz + _lastTrigger(-1000) { } @@ -206,12 +209,21 @@ void PropertyChangeWebsocket::handleRequest(const HTTPRequest & request, Websock void PropertyChangeWebsocket::poll(WebsocketWriter & writer) { + double now = fgGetDouble("/sim/time/elapsed-sec"); + + if( _minTriggerInterval > .0 ) { + if( now - _lastTrigger <= _minTriggerInterval ) + return; + + _lastTrigger = now; + } + for (WatchedNodesList::iterator it = _watchedNodes.begin(); it != _watchedNodes.end(); ++it) { SGPropertyNode_ptr node = *it; string newValue; if (_propertyChangeObserver->isChangedValue(node)) { - string out = JSON::toJsonString( false, node, 0, fgGetDouble("/sim/time/elapsed-sec") ); + string out = JSON::toJsonString( false, node, 0, now ); SG_LOG(SG_NETWORK, SG_DEBUG, "PropertyChangeWebsocket::poll() new Value for " << node->getPath(true) << " '" << node->getStringValue() << "' #" << id << ": " << out ); writer.writeText( out ); } diff --git a/src/Network/http/PropertyChangeWebsocket.hxx b/src/Network/http/PropertyChangeWebsocket.hxx index 3f5af11f5..2409961ca 100644 --- a/src/Network/http/PropertyChangeWebsocket.hxx +++ b/src/Network/http/PropertyChangeWebsocket.hxx @@ -51,6 +51,8 @@ private: }; WatchedNodesList _watchedNodes; + double _minTriggerInterval; + double _lastTrigger; }; }