From e3bc49c30260077fcdb2e3de559f5b718211b2b4 Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Tue, 13 Dec 2016 16:51:59 -0800 Subject: [PATCH] drop avatar data rate to 45hz --- assignment-client/src/avatars/AvatarMixer.cpp | 3 ++- interface/resources/qml/Stats.qml | 3 ++- interface/src/avatar/AvatarManager.cpp | 9 ++++++--- interface/src/avatar/AvatarManager.h | 6 ++++++ interface/src/ui/Stats.cpp | 2 ++ interface/src/ui/Stats.h | 2 ++ 6 files changed, 20 insertions(+), 5 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index 3266e319b1..2586d17620 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -32,7 +32,8 @@ const QString AVATAR_MIXER_LOGGING_NAME = "avatar-mixer"; -const int AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND = 60; +// FIXME - what we'd actually like to do is send to users at ~50% of their present rate down to 30hz. Assume 90 for now. +const int AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND = 45; const unsigned int AVATAR_DATA_SEND_INTERVAL_MSECS = (1.0f / (float) AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND) * 1000; AvatarMixer::AvatarMixer(ReceivedMessage& message) : diff --git a/interface/resources/qml/Stats.qml b/interface/resources/qml/Stats.qml index 734c442437..6be114694d 100644 --- a/interface/resources/qml/Stats.qml +++ b/interface/resources/qml/Stats.qml @@ -154,7 +154,8 @@ Item { StatText { visible: root.expanded; text: "Avatar Mixer Out: " + root.avatarMixerOutKbps + " kbps, " + - root.avatarMixerOutPps + "pps"; + root.avatarMixerOutPps + "pps, " + + root.myAvatarSendRate.toFixed(2) + "hz"; } StatText { visible: root.expanded; diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index c06180c070..e2058ae1cf 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -41,9 +41,11 @@ #include "MyAvatar.h" #include "SceneScriptingInterface.h" -// 70 times per second - target is 60hz, but this helps account for any small deviations -// in the update loop -static const quint64 MIN_TIME_BETWEEN_MY_AVATAR_DATA_SENDS = (1000 * 1000) / 70; +// 50 times per second - target is 45hz, but this helps account for any small deviations +// in the update loop - this also results in ~30hz when in desktop mode which is essentially +// what we want +const int CLIENT_TO_AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND = 50; +static const quint64 MIN_TIME_BETWEEN_MY_AVATAR_DATA_SENDS = USECS_PER_SECOND / CLIENT_TO_AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND; // We add _myAvatar into the hash with all the other AvatarData, and we use the default NULL QUid as the key. const QUuid MY_AVATAR_KEY; // NULL key @@ -118,6 +120,7 @@ void AvatarManager::updateMyAvatar(float deltaTime) { PerformanceTimer perfTimer("send"); _myAvatar->sendAvatarDataPacket(); _lastSendAvatarDataTime = now; + _myAvatarSendRate.increment(); } } diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index 0598dff131..f38796ca08 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -20,6 +20,7 @@ #include #include #include +#include #include "Avatar.h" #include "AvatarMotionState.h" @@ -74,6 +75,8 @@ public: const QScriptValue& avatarIdsToInclude = QScriptValue(), const QScriptValue& avatarIdsToDiscard = QScriptValue()); + float getMyAvatarSendRate() const { return _myAvatarSendRate.rate(); } + public slots: void setShouldShowReceiveStats(bool shouldShowReceiveStats) { _shouldShowReceiveStats = shouldShowReceiveStats; } void updateAvatarRenderStatus(bool shouldRenderAvatars); @@ -106,6 +109,9 @@ private: SetOfAvatarMotionStates _motionStatesThatMightUpdate; SetOfMotionStates _motionStatesToAddToPhysics; VectorOfMotionStates _motionStatesToRemoveFromPhysics; + + RateCounter<> _myAvatarSendRate; + }; Q_DECLARE_METATYPE(AvatarManager::LocalLight) diff --git a/interface/src/ui/Stats.cpp b/interface/src/ui/Stats.cpp index bad2c3c056..07a99d9991 100644 --- a/interface/src/ui/Stats.cpp +++ b/interface/src/ui/Stats.cpp @@ -188,11 +188,13 @@ void Stats::updateStats(bool force) { STAT_UPDATE(avatarMixerInPps, roundf(bandwidthRecorder->getAverageInputPacketsPerSecond(NodeType::AvatarMixer))); STAT_UPDATE(avatarMixerOutKbps, roundf(bandwidthRecorder->getAverageOutputKilobitsPerSecond(NodeType::AvatarMixer))); STAT_UPDATE(avatarMixerOutPps, roundf(bandwidthRecorder->getAverageOutputPacketsPerSecond(NodeType::AvatarMixer))); + STAT_UPDATE(myAvatarSendRate, avatarManager->getMyAvatarSendRate()); } else { STAT_UPDATE(avatarMixerInKbps, -1); STAT_UPDATE(avatarMixerInPps, -1); STAT_UPDATE(avatarMixerOutKbps, -1); STAT_UPDATE(avatarMixerOutPps, -1); + STAT_UPDATE(myAvatarSendRate, avatarManager->getMyAvatarSendRate()); } SharedNodePointer audioMixerNode = nodeList->soloNodeOfType(NodeType::AudioMixer); if (audioMixerNode || force) { diff --git a/interface/src/ui/Stats.h b/interface/src/ui/Stats.h index 5d1aac4287..79d522b44e 100644 --- a/interface/src/ui/Stats.h +++ b/interface/src/ui/Stats.h @@ -62,6 +62,7 @@ class Stats : public QQuickItem { STATS_PROPERTY(int, avatarMixerInPps, 0) STATS_PROPERTY(int, avatarMixerOutKbps, 0) STATS_PROPERTY(int, avatarMixerOutPps, 0) + STATS_PROPERTY(float, myAvatarSendRate, 0) STATS_PROPERTY(int, audioMixerKbps, 0) STATS_PROPERTY(int, audioMixerPps, 0) STATS_PROPERTY(int, downloads, 0) @@ -164,6 +165,7 @@ signals: void avatarMixerInPpsChanged(); void avatarMixerOutKbpsChanged(); void avatarMixerOutPpsChanged(); + void myAvatarSendRateChanged(); void audioMixerKbpsChanged(); void audioMixerPpsChanged(); void downloadsChanged();