From 6c41a2503246e2e8ab3278963261433ed0c7e6db Mon Sep 17 00:00:00 2001 From: Brad Hefta-Gaub Date: Wed, 8 Feb 2017 16:51:00 -0800 Subject: [PATCH] more stats --- interface/src/avatar/Avatar.cpp | 1 + interface/src/avatar/AvatarManager.cpp | 7 ++- interface/src/avatar/AvatarManager.h | 1 + libraries/avatars/src/AvatarData.cpp | 46 ++++++++++++++++++- libraries/avatars/src/AvatarData.h | 20 +++++++- .../developer/debugging/debugAvatarMixer.js | 36 +++++++-------- 6 files changed, 89 insertions(+), 22 deletions(-) diff --git a/interface/src/avatar/Avatar.cpp b/interface/src/avatar/Avatar.cpp index f8105eca16..cb381024ba 100644 --- a/interface/src/avatar/Avatar.cpp +++ b/interface/src/avatar/Avatar.cpp @@ -373,6 +373,7 @@ float Avatar::getSimulationRate(const QString& rateName) { } else if (rateName == "jointData") { return _jointDataSimulationRate.rate(); } + return 0.0f; } bool Avatar::isLookingAtMe(AvatarSharedPointer avatar) const { diff --git a/interface/src/avatar/AvatarManager.cpp b/interface/src/avatar/AvatarManager.cpp index 136d7cc016..aff9ec3add 100644 --- a/interface/src/avatar/AvatarManager.cpp +++ b/interface/src/avatar/AvatarManager.cpp @@ -134,7 +134,12 @@ Q_LOGGING_CATEGORY(trace_simulation_avatar, "trace.simulation.avatar"); float AvatarManager::getAvatarDataRate(const QUuid& sessionID, const QString& rateName) { auto avatar = getAvatarBySessionID(sessionID); - return avatar->getDataRate(rateName); + return avatar ? avatar->getDataRate(rateName) : 0.0f; +} + +float AvatarManager::getAvatarUpdateRate(const QUuid& sessionID, const QString& rateName) { + auto avatar = getAvatarBySessionID(sessionID); + return avatar ? avatar->getUpdateRate(rateName) : 0.0f; } float AvatarManager::getAvatarSimulationRate(const QUuid& sessionID, const QString& rateName) { diff --git a/interface/src/avatar/AvatarManager.h b/interface/src/avatar/AvatarManager.h index c80fd14def..00ae745c98 100644 --- a/interface/src/avatar/AvatarManager.h +++ b/interface/src/avatar/AvatarManager.h @@ -70,6 +70,7 @@ public: void handleCollisionEvents(const CollisionEvents& collisionEvents); Q_INVOKABLE float getAvatarDataRate(const QUuid& sessionID, const QString& rateName = QString("")); + Q_INVOKABLE float getAvatarUpdateRate(const QUuid& sessionID, const QString& rateName = QString("")); Q_INVOKABLE float getAvatarSimulationRate(const QUuid& sessionID, const QString& rateName = QString("")); Q_INVOKABLE RayToAvatarIntersectionResult findRayIntersection(const PickRay& ray, diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index b25140d0a8..146b193a69 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -670,6 +670,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { sourceBuffer += sizeof(AvatarDataPacket::AvatarGlobalPosition); int numBytesRead = sourceBuffer - startSection; _globalPositionRate.increment(numBytesRead); + _globalPositionUpdateRate.increment(); // if we don't have a parent, make sure to also set our local position if (!hasParent()) { @@ -698,6 +699,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { sourceBuffer += sizeof(AvatarDataPacket::AvatarBoundingBox); int numBytesRead = sourceBuffer - startSection; _avatarBoundingBoxRate.increment(numBytesRead); + _avatarBoundingBoxUpdateRate.increment(); } if (hasAvatarOrientation) { @@ -713,6 +715,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { } int numBytesRead = sourceBuffer - startSection; _avatarOrientationRate.increment(numBytesRead); + _avatarOrientationUpdateRate.increment(); } if (hasAvatarScale) { @@ -732,6 +735,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { sourceBuffer += sizeof(AvatarDataPacket::AvatarScale); int numBytesRead = sourceBuffer - startSection; _avatarScaleRate.increment(numBytesRead); + _avatarScaleUpdateRate.increment(); } if (hasLookAtPosition) { @@ -750,6 +754,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { sourceBuffer += sizeof(AvatarDataPacket::LookAtPosition); int numBytesRead = sourceBuffer - startSection; _lookAtPositionRate.increment(numBytesRead); + _lookAtPositionUpdateRate.increment(); } if (hasAudioLoudness) { @@ -770,6 +775,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { _headData->setAudioLoudness(audioLoudness); int numBytesRead = sourceBuffer - startSection; _audioLoudnessRate.increment(numBytesRead); + _audioLoudnessUpdateRate.increment(); } if (hasSensorToWorldMatrix) { @@ -790,6 +796,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { sourceBuffer += sizeof(AvatarDataPacket::SensorToWorldMatrix); int numBytesRead = sourceBuffer - startSection; _sensorToWorldRate.increment(numBytesRead); + _sensorToWorldUpdateRate.increment(); } if (hasAdditionalFlags) { @@ -833,6 +840,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { } int numBytesRead = sourceBuffer - startSection; _additionalFlagsRate.increment(numBytesRead); + _additionalFlagsUpdateRate.increment(); } // FIXME -- make sure to handle the existance of a parent vs a change in the parent... @@ -855,7 +863,9 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { int numBytesRead = sourceBuffer - startSection; _parentInfoRate.increment(numBytesRead); - } else { + _parentInfoUpdateRate.increment(); + } + else { // FIXME - this aint totally right, for switching to parent/no-parent _parentID = QUuid(); } @@ -877,6 +887,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { sourceBuffer += sizeof(AvatarDataPacket::AvatarLocalPosition); int numBytesRead = sourceBuffer - startSection; _localPositionRate.increment(numBytesRead); + _localPositionUpdateRate.increment(); } if (hasFaceTrackerInfo) { @@ -899,6 +910,7 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { sourceBuffer += coefficientsSize; int numBytesRead = sourceBuffer - startSection; _faceTrackerRate.increment(numBytesRead); + _faceTrackerUpdateRate.increment(); } if (hasJointData) { @@ -991,12 +1003,14 @@ int AvatarData::parseDataFromBuffer(const QByteArray& buffer) { int numBytesRead = sourceBuffer - startSection; _jointDataRate.increment(numBytesRead); + _jointDataUpdateRate.increment(); } int numBytesRead = sourceBuffer - startPosition; _averageBytesReceived.updateAverage(numBytesRead); _parseBufferRate.increment(numBytesRead); + _parseBufferUpdateRate.increment(); return numBytesRead; } @@ -1032,6 +1046,36 @@ float AvatarData::getDataRate(const QString& rateName) { return 0.0f; } +float AvatarData::getUpdateRate(const QString& rateName) { + if (rateName == "") { + return _parseBufferUpdateRate.rate(); + } else if (rateName == "globalPosition") { + return _globalPositionUpdateRate.rate(); + } else if (rateName == "localPosition") { + return _localPositionUpdateRate.rate(); + } else if (rateName == "avatarBoundingBox") { + return _avatarBoundingBoxUpdateRate.rate(); + } else if (rateName == "avatarOrientation") { + return _avatarOrientationUpdateRate.rate(); + } else if (rateName == "avatarScale") { + return _avatarScaleUpdateRate.rate(); + } else if (rateName == "lookAtPosition") { + return _lookAtPositionUpdateRate.rate(); + } else if (rateName == "audioLoudness") { + return _audioLoudnessUpdateRate.rate(); + } else if (rateName == "sensorToWorkMatrix") { + return _sensorToWorldUpdateRate.rate(); + } else if (rateName == "additionalFlags") { + return _additionalFlagsUpdateRate.rate(); + } else if (rateName == "parentInfo") { + return _parentInfoUpdateRate.rate(); + } else if (rateName == "faceTracker") { + return _faceTrackerUpdateRate.rate(); + } else if (rateName == "jointData") { + return _jointDataUpdateRate.rate(); + } + return 0.0f; +} int AvatarData::getAverageBytesReceivedPerSecond() const { return lrint(_averageBytesReceived.getAverageSampleValuePerSecond()); diff --git a/libraries/avatars/src/AvatarData.h b/libraries/avatars/src/AvatarData.h index 52cf81798e..4c24cf6ea6 100644 --- a/libraries/avatars/src/AvatarData.h +++ b/libraries/avatars/src/AvatarData.h @@ -528,7 +528,8 @@ public: Q_INVOKABLE glm::mat4 getControllerLeftHandMatrix() const; Q_INVOKABLE glm::mat4 getControllerRightHandMatrix() const; - float getDataRate(const QString& rateName = QString("")); + Q_INVOKABLE float getDataRate(const QString& rateName = QString("")); + Q_INVOKABLE float getUpdateRate(const QString& rateName = QString("")); int getJointCount() { return _jointData.size(); } @@ -644,7 +645,7 @@ protected: quint64 _lastToByteArray { 0 }; // tracks the last time we did a toByteArray - // Some rate data for incoming data + // Some rate data for incoming data in bytes RateCounter<> _parseBufferRate; RateCounter<> _globalPositionRate; RateCounter<> _localPositionRate; @@ -659,6 +660,21 @@ protected: RateCounter<> _faceTrackerRate; RateCounter<> _jointDataRate; + // Some rate data for incoming data updates + RateCounter<> _parseBufferUpdateRate; + RateCounter<> _globalPositionUpdateRate; + RateCounter<> _localPositionUpdateRate; + RateCounter<> _avatarBoundingBoxUpdateRate; + RateCounter<> _avatarOrientationUpdateRate; + RateCounter<> _avatarScaleUpdateRate; + RateCounter<> _lookAtPositionUpdateRate; + RateCounter<> _audioLoudnessUpdateRate; + RateCounter<> _sensorToWorldUpdateRate; + RateCounter<> _additionalFlagsUpdateRate; + RateCounter<> _parentInfoUpdateRate; + RateCounter<> _faceTrackerUpdateRate; + RateCounter<> _jointDataUpdateRate; + glm::vec3 _globalBoundingBoxDimensions; glm::vec3 _globalBoundingBoxOffset; diff --git a/scripts/developer/debugging/debugAvatarMixer.js b/scripts/developer/debugging/debugAvatarMixer.js index 1c11d308b8..fadab96f89 100644 --- a/scripts/developer/debugging/debugAvatarMixer.js +++ b/scripts/developer/debugging/debugAvatarMixer.js @@ -60,24 +60,24 @@ function updateOverlays() { var overlayPosition = avatar.getJointPosition("Head"); overlayPosition.y += 1.05; - var text = "--- Data from Mixer ----------------------\n" - +"All: " + AvatarManager.getAvatarDataRate(avatarID).toFixed(2) + "\n" - +" GP: " + AvatarManager.getAvatarDataRate(avatarID,"globalPosition").toFixed(2) + "\n" - +" LP: " + AvatarManager.getAvatarDataRate(avatarID,"localPosition").toFixed(2) + "\n" - +" BB: " + AvatarManager.getAvatarDataRate(avatarID,"avatarBoundingBox").toFixed(2) + "\n" - +" AO: " + AvatarManager.getAvatarDataRate(avatarID,"avatarOrientation").toFixed(2) + "\n" - +" AS: " + AvatarManager.getAvatarDataRate(avatarID,"avatarScale").toFixed(2) + "\n" - +" LA: " + AvatarManager.getAvatarDataRate(avatarID,"lookAtPosition").toFixed(2) + "\n" - +" AL: " + AvatarManager.getAvatarDataRate(avatarID,"audioLoudness").toFixed(2) + "\n" - +" SW: " + AvatarManager.getAvatarDataRate(avatarID,"sensorToWorkMatrix").toFixed(2) + "\n" - +" AF: " + AvatarManager.getAvatarDataRate(avatarID,"additionalFlags").toFixed(2) + "\n" - +" PI: " + AvatarManager.getAvatarDataRate(avatarID,"parentInfo").toFixed(2) + "\n" - +" FT: " + AvatarManager.getAvatarDataRate(avatarID,"faceTracker").toFixed(2) + "\n" - +" JD: " + AvatarManager.getAvatarDataRate(avatarID,"jointData").toFixed(2) - +"--- Simulation ----------------------\n" + var text = "--- Data from Mixer ---\n" + +"All: " + AvatarManager.getAvatarDataRate(avatarID).toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID).toFixed(2) + "hz)" + "\n" + +" GP: " + AvatarManager.getAvatarDataRate(avatarID,"globalPosition").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"globalPosition").toFixed(2) + "hz)" + "\n" + +" LP: " + AvatarManager.getAvatarDataRate(avatarID,"localPosition").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"localPosition").toFixed(2) + "hz)" + "\n" + +" BB: " + AvatarManager.getAvatarDataRate(avatarID,"avatarBoundingBox").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"avatarBoundingBox").toFixed(2) + "hz)" + "\n" + +" AO: " + AvatarManager.getAvatarDataRate(avatarID,"avatarOrientation").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"avatarOrientation").toFixed(2) + "hz)" + "\n" + +" AS: " + AvatarManager.getAvatarDataRate(avatarID,"avatarScale").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"avatarScale").toFixed(2) + "hz)" + "\n" + +" LA: " + AvatarManager.getAvatarDataRate(avatarID,"lookAtPosition").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"lookAtPosition").toFixed(2) + "hz)" + "\n" + +" AL: " + AvatarManager.getAvatarDataRate(avatarID,"audioLoudness").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"audioLoudness").toFixed(2) + "hz)" + "\n" + +" SW: " + AvatarManager.getAvatarDataRate(avatarID,"sensorToWorkMatrix").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"sensorToWorkMatrix").toFixed(2) + "hz)" + "\n" + +" AF: " + AvatarManager.getAvatarDataRate(avatarID,"additionalFlags").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"additionalFlags").toFixed(2) + "hz)" + "\n" + +" PI: " + AvatarManager.getAvatarDataRate(avatarID,"parentInfo").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"parentInfo").toFixed(2) + "hz)" + "\n" + +" FT: " + AvatarManager.getAvatarDataRate(avatarID,"faceTracker").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"faceTracker").toFixed(2) + "hz)" + "\n" + +" JD: " + AvatarManager.getAvatarDataRate(avatarID,"jointData").toFixed(2) + "kbps (" + AvatarManager.getAvatarUpdateRate(avatarID,"jointData").toFixed(2) + "hz)" + "\n" + +"--- Simulation ---\n" +"All: " + AvatarManager.getAvatarSimulationRate(avatarID,"avatar").toFixed(2) + "\n" +" SM: " + AvatarManager.getAvatarSimulationRate(avatarID,"skeletonModel").toFixed(2) + "\n" - +" JS: " + AvatarManager.getAvatarSimulationRate(avatarID,"jointData").toFixed(2) + "\n" + +" JD: " + AvatarManager.getAvatarSimulationRate(avatarID,"jointData").toFixed(2) + "\n" if (avatarID in debugOverlays) { // keep the overlay above the current position of this avatar @@ -90,8 +90,8 @@ function updateOverlays() { var newOverlay = Overlays.addOverlay("text3d", { position: overlayPosition, dimensions: { - x: 1, - y: 13 * 0.13 + x: 1.25, + y: 18 * 0.13 }, lineHeight: 0.1, font:{size:0.1},