From b13a4b2a71d6b027ae109c06ba2aeae85b5e7596 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Jul 2015 11:07:47 -0700 Subject: [PATCH 01/10] add edit update stats --- interface/src/devices/TV3DManager.cpp | 1 - interface/src/ui/ApplicationCompositor.cpp | 5 ---- interface/src/ui/ApplicationOverlay.cpp | 3 --- interface/src/ui/AvatarInputs.cpp | 1 - interface/src/ui/OctreeStatsDialog.cpp | 15 ++++++++++++ interface/src/ui/OctreeStatsDialog.h | 4 ++++ libraries/entities/src/EntityItem.cpp | 9 +++++++ libraries/entities/src/EntityTree.cpp | 28 ++++++++++++++++++++++ libraries/entities/src/EntityTree.h | 13 ++++++++++ 9 files changed, 69 insertions(+), 10 deletions(-) diff --git a/interface/src/devices/TV3DManager.cpp b/interface/src/devices/TV3DManager.cpp index 41e549a861..e945b5e79a 100644 --- a/interface/src/devices/TV3DManager.cpp +++ b/interface/src/devices/TV3DManager.cpp @@ -109,7 +109,6 @@ void TV3DManager::display(RenderArgs* renderArgs, Camera& whichCamera) { glScissor(portalX, portalY, portalW, portalH); glm::mat4 projection = glm::frustum(eye.left, eye.right, eye.bottom, eye.top, nearZ, farZ); - float fov = atan(1.0f / projection[1][1]); projection = glm::translate(projection, vec3(eye.modelTranslation, 0, 0)); eyeCamera.setProjection(projection); diff --git a/interface/src/ui/ApplicationCompositor.cpp b/interface/src/ui/ApplicationCompositor.cpp index 6cdf690d99..bb19392458 100644 --- a/interface/src/ui/ApplicationCompositor.cpp +++ b/interface/src/ui/ApplicationCompositor.cpp @@ -25,18 +25,13 @@ // Used to animate the magnification windows -static const float MAG_SPEED = 0.08f; static const quint64 MSECS_TO_USECS = 1000ULL; static const quint64 TOOLTIP_DELAY = 500 * MSECS_TO_USECS; -static const float WHITE_TEXT[] = { 0.93f, 0.93f, 0.93f }; static const float RETICLE_COLOR[] = { 0.0f, 198.0f / 255.0f, 244.0f / 255.0f }; static const float reticleSize = TWO_PI / 100.0f; -static const float CONNECTION_STATUS_BORDER_COLOR[] = { 1.0f, 0.0f, 0.0f }; -static const float CONNECTION_STATUS_BORDER_LINE_WIDTH = 4.0f; - static const float CURSOR_PIXEL_SIZE = 32.0f; static const float MOUSE_PITCH_RANGE = 1.0f * PI; static const float MOUSE_YAW_RANGE = 0.5f * TWO_PI; diff --git a/interface/src/ui/ApplicationOverlay.cpp b/interface/src/ui/ApplicationOverlay.cpp index 63f68b86ce..e7d220893f 100644 --- a/interface/src/ui/ApplicationOverlay.cpp +++ b/interface/src/ui/ApplicationOverlay.cpp @@ -36,9 +36,6 @@ #include "ui/Stats.h" #include "ui/AvatarInputs.h" -const float WHITE_TEXT[] = { 0.93f, 0.93f, 0.93f }; -const int AUDIO_METER_GAP = 5; -const int MUTE_ICON_PADDING = 10; const vec4 CONNECTION_STATUS_BORDER_COLOR{ 1.0f, 0.0f, 0.0f, 0.8f }; const float CONNECTION_STATUS_BORDER_LINE_WIDTH = 4.0f; static const float ORTHO_NEAR_CLIP = -10000; diff --git a/interface/src/ui/AvatarInputs.cpp b/interface/src/ui/AvatarInputs.cpp index 11f744aaca..870038cd01 100644 --- a/interface/src/ui/AvatarInputs.cpp +++ b/interface/src/ui/AvatarInputs.cpp @@ -67,7 +67,6 @@ void AvatarInputs::update() { AI_UPDATE(cameraMuted, Menu::getInstance()->isOptionChecked(MenuOption::MuteFaceTracking)); auto audioIO = DependencyManager::get(); - const float CLIPPING_INDICATOR_TIME = 1.0f; const float AUDIO_METER_AVERAGING = 0.5; const float LOG2 = log(2.0f); const float METER_LOUDNESS_SCALE = 2.8f / 5.0f; diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index 462811fc1c..4e55e3beef 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -50,6 +50,7 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo _localElements = AddStatItem("Local Elements"); _localElementsMemory = AddStatItem("Elements Memory"); _sendingMode = AddStatItem("Sending Mode"); + _entityUpdateTime = AddStatItem("Entity Update Time"); layout()->setSizeConstraint(QLayout::SetFixedSize); } @@ -203,6 +204,20 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { "Leaves: " << qPrintable(serversLeavesString) << ""; label->setText(statsValue.str().c_str()); + label = _labels[_entityUpdateTime]; + auto entites = Application::getInstance()->getEntities()->getTree(); + quint64 averageEditDelta = entites->getAverageEditDeltas(); + QString averageEditDeltaString = locale.toString((uint)averageEditDelta); + quint64 maxEditDelta = entites->getMaxEditDelta(); + QString maxEditDeltaString = locale.toString((uint)maxEditDelta); + + statsValue.str(""); + statsValue << + "Average: " << qPrintable(averageEditDeltaString) << " (usecs) / " << + "Max: " << qPrintable(maxEditDeltaString) << " (usecs)"; + label->setText(statsValue.str().c_str()); + + showAllOctreeServers(); this->QDialog::paintEvent(event); diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index 03683d8171..5ddda8067a 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -63,6 +63,10 @@ private: int _serverElements; int _localElements; int _localElementsMemory; + + int _entityUpdateTime; + + int _octreeServerLables[MAX_VOXEL_SERVERS]; int _octreeServerLabelsCount; details _extraServerDetails[MAX_VOXEL_SERVERS]; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 74b7a36504..e24f6846fd 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -414,6 +414,14 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef dataAt += sizeof(lastEditedFromBuffer); bytesRead += sizeof(lastEditedFromBuffer); lastEditedFromBufferAdjusted = lastEditedFromBuffer - clockSkew; + + // Tracking for editing roundtrips here. We will tell our EntityTree that we just got incoming data about + // and entity that was edited at some time in the past. The tree will determine how it wants to track this + // information. + if (_element && _element->getTree()) { + _element->getTree()->trackIncomingEntityLastEdited(lastEditedFromBufferAdjusted); + } + if (lastEditedFromBufferAdjusted > now) { lastEditedFromBufferAdjusted = now; } @@ -486,6 +494,7 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef qCDebug(entities) << " lastEditedFromBufferAdjusted:" << debugTime(lastEditedFromBufferAdjusted, now); #endif } + encodedUpdateDelta = updateDeltaCoder; // determine true length dataAt += encodedUpdateDelta.size(); bytesRead += encodedUpdateDelta.size(); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 6a652d609b..0fbe6d40ed 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -34,6 +34,7 @@ EntityTree::EntityTree(bool shouldReaverage) : _simulation(NULL) { _rootElement = createNewElement(); + resetClientEditStats(); } EntityTree::~EntityTree() { @@ -60,6 +61,8 @@ void EntityTree::eraseAllOctreeElements(bool createNewRoot) { } _entityToElementMap.clear(); Octree::eraseAllOctreeElements(createNewRoot); + + resetClientEditStats(); } bool EntityTree::handlesEditPacketType(PacketType packetType) const { @@ -1104,3 +1107,28 @@ bool EntityTree::readFromMap(QVariantMap& map) { return true; } + +void EntityTree::resetClientEditStats() { + _treeResetTime = usecTimestampNow(); + _maxEditDelta = 0; + _totalEditDeltas = 0; + _totalTrackedEdits = 0; +} + + + +void EntityTree::trackIncomingEntityLastEdited(quint64 lastEditedTime) { + // we don't want to track all edit deltas, just those edits that have happend + // since we connected to this domain. This will filter out all previously created + // content and only track new edits + if (lastEditedTime > _treeResetTime) { + quint64 now = usecTimestampNow(); + quint64 sinceEdit = now - lastEditedTime; + + _totalEditDeltas += sinceEdit; + _totalTrackedEdits++; + if (sinceEdit > _maxEditDelta) { + _maxEditDelta = sinceEdit; + } + } +} diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index fa72cc7691..9db57af383 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -185,6 +185,12 @@ public: virtual quint64 getAverageCreateTime() const { return _totalCreates == 0 ? 0 : _totalCreateTime / _totalCreates; } virtual quint64 getAverageLoggingTime() const { return _totalEditMessages == 0 ? 0 : _totalLoggingTime / _totalEditMessages; } + void trackIncomingEntityLastEdited(quint64 lastEditedTime); + quint64 getAverageEditDeltas() const + { return _totalTrackedEdits == 0 ? 0 : _totalEditDeltas / _totalTrackedEdits; } + quint64 getMaxEditDelta() const + { return _maxEditDelta; } + signals: void deletingEntity(const EntityItemID& entityID); void addingEntity(const EntityItemID& entityID); @@ -230,6 +236,13 @@ private: quint64 _totalUpdateTime = 0; quint64 _totalCreateTime = 0; quint64 _totalLoggingTime = 0; + + // these performance statistics are only used in the client + void resetClientEditStats(); + int _totalTrackedEdits = 0; + quint64 _totalEditDeltas = 0; + quint64 _maxEditDelta = 0; + quint64 _treeResetTime = 0; }; #endif // hifi_EntityTree_h From 63b585da0fda9cccd69453513c5ba545c39e44e3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Jul 2015 13:28:12 -0700 Subject: [PATCH 02/10] added updates per second stat --- interface/src/ui/OctreeStatsDialog.cpp | 43 ++++++++++++++++++++++++-- interface/src/ui/OctreeStatsDialog.h | 6 +++- libraries/entities/src/EntityTree.h | 4 +-- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index 4e55e3beef..9426f2b2e0 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -25,7 +25,9 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* model) : QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint), - _model(model) { + _model(model), + _averageUpdatesPerSecond(SAMPLES_PER_SECOND) +{ _statCount = 0; _octreeServerLabelsCount = 0; @@ -51,6 +53,7 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo _localElementsMemory = AddStatItem("Elements Memory"); _sendingMode = AddStatItem("Sending Mode"); _entityUpdateTime = AddStatItem("Entity Update Time"); + _entityUpdates = AddStatItem("Entity Updates"); layout()->setSizeConstraint(QLayout::SetFixedSize); } @@ -204,19 +207,53 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { "Leaves: " << qPrintable(serversLeavesString) << ""; label->setText(statsValue.str().c_str()); + // Entity Edits update time label = _labels[_entityUpdateTime]; auto entites = Application::getInstance()->getEntities()->getTree(); - quint64 averageEditDelta = entites->getAverageEditDeltas(); + auto averageEditDelta = entites->getAverageEditDeltas(); + auto maxEditDelta = entites->getMaxEditDelta(); + QString averageEditDeltaString = locale.toString((uint)averageEditDelta); - quint64 maxEditDelta = entites->getMaxEditDelta(); QString maxEditDeltaString = locale.toString((uint)maxEditDelta); statsValue.str(""); statsValue << "Average: " << qPrintable(averageEditDeltaString) << " (usecs) / " << "Max: " << qPrintable(maxEditDeltaString) << " (usecs)"; + label->setText(statsValue.str().c_str()); + // Entity Edits + label = _labels[_entityUpdates]; + auto totalTrackedEdits = entites->getTotalTrackedEdits(); + + // track our updated per second + const quint64 SAMPLING_WINDOW = USECS_PER_SECOND / SAMPLES_PER_SECOND; + quint64 now = usecTimestampNow(); + quint64 sinceLastWindow = now - _lastWindowAt; + auto editsInLastWindow = totalTrackedEdits - _lastKnownTrackedEdits; + float sinceLastWindowInSeconds = (float)sinceLastWindow / (float)USECS_PER_SECOND; + float recentUpdatesPerSecond = (float)editsInLastWindow / sinceLastWindowInSeconds; + if (sinceLastWindow > SAMPLING_WINDOW) { + _averageUpdatesPerSecond.updateAverage(recentUpdatesPerSecond); + _lastWindowAt = now; + _lastKnownTrackedEdits = totalTrackedEdits; + } + + auto updatesPerSecond = _averageUpdatesPerSecond.getAverage(); + if (updatesPerSecond < 1) { + updatesPerSecond = 0; // we don't really care about small updates per second so suppress those + } + + QString totalTrackedEditsString = locale.toString((uint)totalTrackedEdits); + QString updatesPerSecondString = locale.toString(updatesPerSecond); + + statsValue.str(""); + statsValue << + "" << qPrintable(updatesPerSecondString) << " updates per second / " << + "" << qPrintable(totalTrackedEditsString) << " total updates "; + + label->setText(statsValue.str().c_str()); showAllOctreeServers(); diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index 5ddda8067a..acbf766510 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -65,7 +65,11 @@ private: int _localElementsMemory; int _entityUpdateTime; - + int _entityUpdates; + const int SAMPLES_PER_SECOND = 10; + SimpleMovingAverage _averageUpdatesPerSecond; + quint64 _lastWindowAt = 0; + quint64 _lastKnownTrackedEdits = 0; int _octreeServerLables[MAX_VOXEL_SERVERS]; int _octreeServerLabelsCount; diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 9db57af383..92c726729d 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -188,8 +188,8 @@ public: void trackIncomingEntityLastEdited(quint64 lastEditedTime); quint64 getAverageEditDeltas() const { return _totalTrackedEdits == 0 ? 0 : _totalEditDeltas / _totalTrackedEdits; } - quint64 getMaxEditDelta() const - { return _maxEditDelta; } + quint64 getMaxEditDelta() const { return _maxEditDelta; } + quint64 getTotalTrackedEdits() const { return _totalTrackedEdits; } signals: void deletingEntity(const EntityItemID& entityID); From 5c4d4893def43ca46c10f39eef2a0ce38c4662d5 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Jul 2015 13:44:28 -0700 Subject: [PATCH 03/10] added bytes per edit stats --- interface/src/ui/OctreeStatsDialog.cpp | 13 ++++++++----- libraries/entities/src/EntityItem.cpp | 15 ++++++++------- libraries/entities/src/EntityTree.cpp | 3 ++- libraries/entities/src/EntityTree.h | 5 ++++- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index 9426f2b2e0..c8784f69b8 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -209,9 +209,9 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { // Entity Edits update time label = _labels[_entityUpdateTime]; - auto entites = Application::getInstance()->getEntities()->getTree(); - auto averageEditDelta = entites->getAverageEditDeltas(); - auto maxEditDelta = entites->getMaxEditDelta(); + auto entities = Application::getInstance()->getEntities()->getTree(); + auto averageEditDelta = entities->getAverageEditDeltas(); + auto maxEditDelta = entities->getMaxEditDelta(); QString averageEditDeltaString = locale.toString((uint)averageEditDelta); QString maxEditDeltaString = locale.toString((uint)maxEditDelta); @@ -225,7 +225,8 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { // Entity Edits label = _labels[_entityUpdates]; - auto totalTrackedEdits = entites->getTotalTrackedEdits(); + auto totalTrackedEdits = entities->getTotalTrackedEdits(); + auto bytesPerEdit = entities->getAverageEditBytes(); // track our updated per second const quint64 SAMPLING_WINDOW = USECS_PER_SECOND / SAMPLES_PER_SECOND; @@ -247,11 +248,13 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { QString totalTrackedEditsString = locale.toString((uint)totalTrackedEdits); QString updatesPerSecondString = locale.toString(updatesPerSecond); + QString bytesPerEditString = locale.toString(bytesPerEdit); statsValue.str(""); statsValue << "" << qPrintable(updatesPerSecondString) << " updates per second / " << - "" << qPrintable(totalTrackedEditsString) << " total updates "; + "" << qPrintable(totalTrackedEditsString) << " total updates / " << + "Average Size: " << qPrintable(bytesPerEditString) << " bytes "; label->setText(statsValue.str().c_str()); diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index e24f6846fd..0f681ba5f7 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -415,13 +415,6 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef bytesRead += sizeof(lastEditedFromBuffer); lastEditedFromBufferAdjusted = lastEditedFromBuffer - clockSkew; - // Tracking for editing roundtrips here. We will tell our EntityTree that we just got incoming data about - // and entity that was edited at some time in the past. The tree will determine how it wants to track this - // information. - if (_element && _element->getTree()) { - _element->getTree()->trackIncomingEntityLastEdited(lastEditedFromBufferAdjusted); - } - if (lastEditedFromBufferAdjusted > now) { lastEditedFromBufferAdjusted = now; } @@ -646,6 +639,14 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef } } + // Tracking for editing roundtrips here. We will tell our EntityTree that we just got incoming data about + // and entity that was edited at some time in the past. The tree will determine how it wants to track this + // information. + if (_element && _element->getTree()) { + _element->getTree()->trackIncomingEntityLastEdited(lastEditedFromBufferAdjusted, bytesRead); + } + + return bytesRead; } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 0fbe6d40ed..ae4d8ab236 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1117,7 +1117,7 @@ void EntityTree::resetClientEditStats() { -void EntityTree::trackIncomingEntityLastEdited(quint64 lastEditedTime) { +void EntityTree::trackIncomingEntityLastEdited(quint64 lastEditedTime, int bytesRead) { // we don't want to track all edit deltas, just those edits that have happend // since we connected to this domain. This will filter out all previously created // content and only track new edits @@ -1126,6 +1126,7 @@ void EntityTree::trackIncomingEntityLastEdited(quint64 lastEditedTime) { quint64 sinceEdit = now - lastEditedTime; _totalEditDeltas += sinceEdit; + _totalEditBytes += bytesRead; _totalTrackedEdits++; if (sinceEdit > _maxEditDelta) { _maxEditDelta = sinceEdit; diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 92c726729d..263cff2171 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -185,9 +185,11 @@ public: virtual quint64 getAverageCreateTime() const { return _totalCreates == 0 ? 0 : _totalCreateTime / _totalCreates; } virtual quint64 getAverageLoggingTime() const { return _totalEditMessages == 0 ? 0 : _totalLoggingTime / _totalEditMessages; } - void trackIncomingEntityLastEdited(quint64 lastEditedTime); + void trackIncomingEntityLastEdited(quint64 lastEditedTime, int bytesRead); quint64 getAverageEditDeltas() const { return _totalTrackedEdits == 0 ? 0 : _totalEditDeltas / _totalTrackedEdits; } + quint64 getAverageEditBytes() const + { return _totalTrackedEdits == 0 ? 0 : _totalEditBytes / _totalTrackedEdits; } quint64 getMaxEditDelta() const { return _maxEditDelta; } quint64 getTotalTrackedEdits() const { return _totalTrackedEdits; } @@ -240,6 +242,7 @@ private: // these performance statistics are only used in the client void resetClientEditStats(); int _totalTrackedEdits = 0; + quint64 _totalEditBytes = 0; quint64 _totalEditDeltas = 0; quint64 _maxEditDelta = 0; quint64 _treeResetTime = 0; From 0c0b8dbbc15c0255abc06453a596ca1b9e17b8f1 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Jul 2015 16:19:13 -0700 Subject: [PATCH 04/10] add stats for elements and entities per incoming packet --- interface/src/ui/OctreeStatsDialog.cpp | 28 ++++++++++++++++---- interface/src/ui/OctreeStatsDialog.h | 2 ++ libraries/entities/src/EntityItem.cpp | 2 ++ libraries/entities/src/EntityTreeElement.cpp | 2 ++ libraries/octree/src/Octree.h | 2 ++ libraries/octree/src/OctreeRenderer.cpp | 15 +++++++++-- libraries/octree/src/OctreeRenderer.h | 7 +++++ 7 files changed, 51 insertions(+), 7 deletions(-) diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index c8784f69b8..12ed3cf36f 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -52,6 +52,8 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo _localElements = AddStatItem("Local Elements"); _localElementsMemory = AddStatItem("Elements Memory"); _sendingMode = AddStatItem("Sending Mode"); + + _entityPackets = AddStatItem("Entity Packets"); _entityUpdateTime = AddStatItem("Entity Update Time"); _entityUpdates = AddStatItem("Entity Updates"); @@ -207,11 +209,27 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { "Leaves: " << qPrintable(serversLeavesString) << ""; label->setText(statsValue.str().c_str()); + // Entity Edits update time + label = _labels[_entityPackets]; + auto entities = Application::getInstance()->getEntities(); + auto entitiesTree = entities->getTree(); + auto averageElementsPerPacket = entities->getAverageElementsPerPacket(); + auto averageEntitiesPerPacket = entities->getAverageEntitiesPerPacket(); + + QString averageElementsPerPacketString = locale.toString(averageElementsPerPacket); + QString averageEntitiesPerPacketString = locale.toString(averageEntitiesPerPacket); + + statsValue.str(""); + statsValue << + "Elements: " << qPrintable(averageEntitiesPerPacketString) << " per packet / " << + "Entities: " << qPrintable(averageEntitiesPerPacketString) << " per packet"; + + label->setText(statsValue.str().c_str()); + // Entity Edits update time label = _labels[_entityUpdateTime]; - auto entities = Application::getInstance()->getEntities()->getTree(); - auto averageEditDelta = entities->getAverageEditDeltas(); - auto maxEditDelta = entities->getMaxEditDelta(); + auto averageEditDelta = entitiesTree->getAverageEditDeltas(); + auto maxEditDelta = entitiesTree->getMaxEditDelta(); QString averageEditDeltaString = locale.toString((uint)averageEditDelta); QString maxEditDeltaString = locale.toString((uint)maxEditDelta); @@ -225,8 +243,8 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { // Entity Edits label = _labels[_entityUpdates]; - auto totalTrackedEdits = entities->getTotalTrackedEdits(); - auto bytesPerEdit = entities->getAverageEditBytes(); + auto totalTrackedEdits = entitiesTree->getTotalTrackedEdits(); + auto bytesPerEdit = entitiesTree->getAverageEditBytes(); // track our updated per second const quint64 SAMPLING_WINDOW = USECS_PER_SECOND / SAMPLES_PER_SECOND; diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index acbf766510..4c59744af2 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -66,6 +66,8 @@ private: int _entityUpdateTime; int _entityUpdates; + int _entityPackets; + const int SAMPLES_PER_SECOND = 10; SimpleMovingAverage _averageUpdatesPerSecond; quint64 _lastWindowAt = 0; diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 511238efca..5e129365fe 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -346,6 +346,8 @@ int EntityItem::readEntityDataFromBuffer(const unsigned char* data, int bytesLef return 0; } + args.entitiesPerPacket++; + // Header bytes // object ID [16 bytes] // ByteCountCoded(type code) [~1 byte] diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 4bc81e1da6..41c0529b80 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -702,6 +702,8 @@ int EntityTreeElement::readElementDataFromBuffer(const unsigned char* data, int int bytesRead = 0; uint16_t numberOfEntities = 0; int expectedBytesPerEntity = EntityItem::expectedBytes(); + + args.elementsPerPacket++; if (bytesLeftToRead >= (int)sizeof(numberOfEntities)) { // read our entities in.... diff --git a/libraries/octree/src/Octree.h b/libraries/octree/src/Octree.h index 6eeb423ddd..f1d32aa390 100644 --- a/libraries/octree/src/Octree.h +++ b/libraries/octree/src/Octree.h @@ -195,6 +195,8 @@ public: SharedNodePointer sourceNode; bool wantImportProgress; PacketVersion bitstreamVersion; + int elementsPerPacket = 0; + int entitiesPerPacket = 0; ReadBitstreamToTreeParams( bool includeColor = WANT_COLOR, diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 7852f1d4b4..f4c5491678 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -101,6 +101,9 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar sequence, flightTime, packetLength, dataBytes); } + int elementsPerPacket = 0; + int entitiesPerPacket = 0; + int subsection = 1; while (dataBytes > 0) { if (packetIsCompressed) { @@ -139,13 +142,21 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar qCDebug(octree) << "OctreeRenderer::processDatagram() ******* END _tree->readBitstreamToTree()..."; } _tree->unlock(); - + dataBytes -= sectionLength; dataAt += sectionLength; + + elementsPerPacket += args.elementsPerPacket; + entitiesPerPacket += args.entitiesPerPacket; + } + subsection++; } - subsection++; + _elementsPerPacket.updateAverage(elementsPerPacket); + _entitiesPerPacket.updateAverage(entitiesPerPacket); } + + } bool OctreeRenderer::renderOperation(OctreeElement* element, void* extraData) { diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index 98026b732c..9a70e0923e 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -61,12 +61,19 @@ public: /// clears the tree virtual void clear(); + float getAverageElementsPerPacket() const { return _elementsPerPacket.getAverage(); } + float getAverageEntitiesPerPacket() const { return _entitiesPerPacket.getAverage(); } + protected: virtual Octree* createTree() = 0; Octree* _tree; bool _managedTree; ViewFrustum* _viewFrustum; + + SimpleMovingAverage _elementsPerPacket; + SimpleMovingAverage _entitiesPerPacket; + }; #endif // hifi_OctreeRenderer_h From 8916dd205664761e2052a09562eade21c2e0f889 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Jul 2015 17:00:35 -0700 Subject: [PATCH 05/10] add stats for elements and entities per second --- interface/src/ui/OctreeStatsDialog.cpp | 25 ++++++++++++++++++++----- interface/src/ui/OctreeStatsDialog.h | 3 ++- libraries/octree/src/OctreeRenderer.cpp | 23 +++++++++++++++++++++-- libraries/octree/src/OctreeRenderer.h | 9 +++++++++ 4 files changed, 52 insertions(+), 8 deletions(-) diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index 12ed3cf36f..ce9034ce2d 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -53,7 +53,8 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo _localElementsMemory = AddStatItem("Elements Memory"); _sendingMode = AddStatItem("Sending Mode"); - _entityPackets = AddStatItem("Entity Packets"); + _processedPacketsElements = AddStatItem("Processed Packets Elements"); + _processedPacketsEntities = AddStatItem("Processed Packets Entities"); _entityUpdateTime = AddStatItem("Entity Update Time"); _entityUpdates = AddStatItem("Entity Updates"); @@ -209,20 +210,34 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { "Leaves: " << qPrintable(serversLeavesString) << ""; label->setText(statsValue.str().c_str()); - // Entity Edits update time - label = _labels[_entityPackets]; + // Processed Entities Related stats auto entities = Application::getInstance()->getEntities(); auto entitiesTree = entities->getTree(); + + // Processed Packets Elements auto averageElementsPerPacket = entities->getAverageElementsPerPacket(); auto averageEntitiesPerPacket = entities->getAverageEntitiesPerPacket(); + auto averageElementsPerSecond = entities->getAverageElementsPerSecond(); + auto averageEntitiesPerSecond = entities->getAverageEntitiesPerSecond(); QString averageElementsPerPacketString = locale.toString(averageElementsPerPacket); QString averageEntitiesPerPacketString = locale.toString(averageEntitiesPerPacket); + QString averageElementsPerSecondString = locale.toString(averageElementsPerSecond); + QString averageEntitiesPerSecondString = locale.toString(averageEntitiesPerSecond); + label = _labels[_processedPacketsElements]; statsValue.str(""); statsValue << - "Elements: " << qPrintable(averageEntitiesPerPacketString) << " per packet / " << - "Entities: " << qPrintable(averageEntitiesPerPacketString) << " per packet"; + "" << qPrintable(averageElementsPerPacketString) << " per packet / " << + "" << qPrintable(averageElementsPerSecondString) << " per second"; + + label->setText(statsValue.str().c_str()); + + label = _labels[_processedPacketsEntities]; + statsValue.str(""); + statsValue << + "" << qPrintable(averageEntitiesPerPacketString) << " per packet / " << + "" << qPrintable(averageEntitiesPerSecondString) << " per second"; label->setText(statsValue.str().c_str()); diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index 4c59744af2..9b0b1ad90a 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -66,7 +66,8 @@ private: int _entityUpdateTime; int _entityUpdates; - int _entityPackets; + int _processedPacketsElements; + int _processedPacketsEntities; const int SAMPLES_PER_SECOND = 10; SimpleMovingAverage _averageUpdatesPerSecond; diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index f4c5491678..e77f652932 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -149,14 +149,33 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar elementsPerPacket += args.elementsPerPacket; entitiesPerPacket += args.entitiesPerPacket; + _elementsInLastWindow += args.elementsPerPacket; + _entitiesInLastWindow += args.entitiesPerPacket; + } subsection++; } _elementsPerPacket.updateAverage(elementsPerPacket); _entitiesPerPacket.updateAverage(entitiesPerPacket); + + quint64 now = usecTimestampNow(); + if (_lastWindowAt == 0) { + _lastWindowAt = now; + } + quint64 sinceLastWindow = now - _lastWindowAt; + + const quint64 USECS_PER_SECOND = 1000 * 1000; + if (sinceLastWindow > USECS_PER_SECOND) { + float elementsPerSecondInWindow = (float)_elementsInLastWindow / (float)(sinceLastWindow / USECS_PER_SECOND); + float entitiesPerSecondInWindow = (float)_entitiesInLastWindow / (float)(sinceLastWindow / USECS_PER_SECOND); + _elementsPerSecond.updateAverage(elementsPerSecondInWindow); + _entitiesPerSecond.updateAverage(entitiesPerSecondInWindow); + + _lastWindowAt = now; + _elementsInLastWindow = 0; + _entitiesInLastWindow = 0; + } } - - } bool OctreeRenderer::renderOperation(OctreeElement* element, void* extraData) { diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index 9a70e0923e..de0f4dc1bb 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -63,6 +63,9 @@ public: float getAverageElementsPerPacket() const { return _elementsPerPacket.getAverage(); } float getAverageEntitiesPerPacket() const { return _entitiesPerPacket.getAverage(); } + + float getAverageElementsPerSecond() const { return _elementsPerSecond.getAverage(); } + float getAverageEntitiesPerSecond() const { return _entitiesPerSecond.getAverage(); } protected: virtual Octree* createTree() = 0; @@ -73,6 +76,12 @@ protected: SimpleMovingAverage _elementsPerPacket; SimpleMovingAverage _entitiesPerPacket; + SimpleMovingAverage _elementsPerSecond; + SimpleMovingAverage _entitiesPerSecond; + + quint64 _lastWindowAt = 0; + int _elementsInLastWindow = 0; + int _entitiesInLastWindow = 0; }; From a54cf6706470b28b10e7feb539cc5a254bd055d4 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Jul 2015 17:28:53 -0700 Subject: [PATCH 06/10] add stats for processing time per packet --- interface/src/ui/OctreeStatsDialog.cpp | 19 +++++++++++++++++++ interface/src/ui/OctreeStatsDialog.h | 1 + libraries/octree/src/OctreeRenderer.cpp | 16 ++++++++++++++++ libraries/octree/src/OctreeRenderer.h | 8 ++++++++ 4 files changed, 44 insertions(+) diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index ce9034ce2d..4c95e7a68a 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -55,6 +55,8 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo _processedPacketsElements = AddStatItem("Processed Packets Elements"); _processedPacketsEntities = AddStatItem("Processed Packets Entities"); + _processedPacketsTiming = AddStatItem("Processed Packets Timing"); + _entityUpdateTime = AddStatItem("Entity Update Time"); _entityUpdates = AddStatItem("Entity Updates"); @@ -220,11 +222,19 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { auto averageElementsPerSecond = entities->getAverageElementsPerSecond(); auto averageEntitiesPerSecond = entities->getAverageEntitiesPerSecond(); + auto averageWaitLockPerPacket = entities->getAverageWaitLockPerPacket(); + auto averageUncompressPerPacket = entities->getAverageUncompressPerPacket(); + auto averageReadBitstreamPerPacket = entities->getAverageReadBitstreamPerPacket(); + QString averageElementsPerPacketString = locale.toString(averageElementsPerPacket); QString averageEntitiesPerPacketString = locale.toString(averageEntitiesPerPacket); QString averageElementsPerSecondString = locale.toString(averageElementsPerSecond); QString averageEntitiesPerSecondString = locale.toString(averageEntitiesPerSecond); + QString averageWaitLockPerPacketString = locale.toString(averageWaitLockPerPacket); + QString averageUncompressPerPacketString = locale.toString(averageUncompressPerPacket); + QString averageReadBitstreamPerPacketString = locale.toString(averageReadBitstreamPerPacket); + label = _labels[_processedPacketsElements]; statsValue.str(""); statsValue << @@ -241,6 +251,15 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { label->setText(statsValue.str().c_str()); + label = _labels[_processedPacketsTiming]; + statsValue.str(""); + statsValue << + "Lock Wait:" << qPrintable(averageWaitLockPerPacketString) << " (usecs) / " << + "Uncompress:" << qPrintable(averageUncompressPerPacketString) << " (usecs) / " << + "Process:" << qPrintable(averageReadBitstreamPerPacketString) << " (usecs)"; + + label->setText(statsValue.str().c_str()); + // Entity Edits update time label = _labels[_entityUpdateTime]; auto averageEditDelta = entitiesTree->getAverageEditDeltas(); diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index 9b0b1ad90a..986080de56 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -68,6 +68,7 @@ private: int _entityUpdates; int _processedPacketsElements; int _processedPacketsEntities; + int _processedPacketsTiming; const int SAMPLES_PER_SECOND = 10; SimpleMovingAverage _averageUpdatesPerSecond; diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index e77f652932..5ffc22d5ee 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -104,6 +104,10 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar int elementsPerPacket = 0; int entitiesPerPacket = 0; + quint64 totalWaitingForLock = 0; + quint64 totalUncompress = 0; + quint64 totalReadBitsteam = 0; + int subsection = 1; while (dataBytes > 0) { if (packetIsCompressed) { @@ -123,7 +127,9 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar // ask the VoxelTree to read the bitstream into the tree ReadBitstreamToTreeParams args(packetIsColored ? WANT_COLOR : NO_COLOR, WANT_EXISTS_BITS, NULL, sourceUUID, sourceNode, false, packetVersion); + quint64 startLock = usecTimestampNow(); _tree->lockForWrite(); + quint64 startUncompress = usecTimestampNow(); OctreePacketData packetData(packetIsCompressed); packetData.loadFinalizedContent(dataAt, sectionLength); if (extraDebugging) { @@ -137,7 +143,9 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar if (extraDebugging) { qCDebug(octree) << "OctreeRenderer::processDatagram() ******* START _tree->readBitstreamToTree()..."; } + quint64 startReadBitsteam = usecTimestampNow(); _tree->readBitstreamToTree(packetData.getUncompressedData(), packetData.getUncompressedSize(), args); + quint64 endReadBitsteam = usecTimestampNow(); if (extraDebugging) { qCDebug(octree) << "OctreeRenderer::processDatagram() ******* END _tree->readBitstreamToTree()..."; } @@ -152,11 +160,19 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar _elementsInLastWindow += args.elementsPerPacket; _entitiesInLastWindow += args.entitiesPerPacket; + totalWaitingForLock += (startUncompress - startLock); + totalUncompress += (startReadBitsteam - startUncompress); + totalReadBitsteam += (endReadBitsteam - startReadBitsteam); + } subsection++; } _elementsPerPacket.updateAverage(elementsPerPacket); _entitiesPerPacket.updateAverage(entitiesPerPacket); + + _waitLockPerPacket.updateAverage(totalWaitingForLock); + _uncompressPerPacket.updateAverage(totalUncompress); + _readBitstreamPerPacket.updateAverage(totalReadBitsteam); quint64 now = usecTimestampNow(); if (_lastWindowAt == 0) { diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index de0f4dc1bb..894e5c2355 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -66,6 +66,10 @@ public: float getAverageElementsPerSecond() const { return _elementsPerSecond.getAverage(); } float getAverageEntitiesPerSecond() const { return _entitiesPerSecond.getAverage(); } + + float getAverageWaitLockPerPacket() const { return _waitLockPerPacket.getAverage(); } + float getAverageUncompressPerPacket() const { return _uncompressPerPacket.getAverage(); } + float getAverageReadBitstreamPerPacket() const { return _readBitstreamPerPacket.getAverage(); } protected: virtual Octree* createTree() = 0; @@ -79,6 +83,10 @@ protected: SimpleMovingAverage _elementsPerSecond; SimpleMovingAverage _entitiesPerSecond; + SimpleMovingAverage _waitLockPerPacket; + SimpleMovingAverage _uncompressPerPacket; + SimpleMovingAverage _readBitstreamPerPacket; + quint64 _lastWindowAt = 0; int _elementsInLastWindow = 0; int _entitiesInLastWindow = 0; From e1530b3ce942fa2f19b730089d81fe5de02309ac Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 Jul 2015 18:15:24 -0700 Subject: [PATCH 07/10] added a FIXME STUTTER note --- libraries/octree/src/OctreeRenderer.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 5ffc22d5ee..6fa3f47120 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -128,6 +128,9 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar ReadBitstreamToTreeParams args(packetIsColored ? WANT_COLOR : NO_COLOR, WANT_EXISTS_BITS, NULL, sourceUUID, sourceNode, false, packetVersion); quint64 startLock = usecTimestampNow(); + + // FIXME STUTTER - there may be an opportunity to bump this lock outside of the + // loop to reduce the amount of locking/unlocking we're doing _tree->lockForWrite(); quint64 startUncompress = usecTimestampNow(); OctreePacketData packetData(packetIsCompressed); From 40cdd8646e3c727fdbb558fd618ed231a39e274b Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 3 Jul 2015 15:53:53 -0700 Subject: [PATCH 08/10] add packets per second to octree processing stats --- interface/src/ui/OctreeStatsDialog.cpp | 12 ++++++++++++ interface/src/ui/OctreeStatsDialog.h | 1 + libraries/octree/src/OctreeRenderer.cpp | 5 +++++ libraries/octree/src/OctreeRenderer.h | 4 ++++ 4 files changed, 22 insertions(+) diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index 4c95e7a68a..eea962b412 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -53,6 +53,7 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo _localElementsMemory = AddStatItem("Elements Memory"); _sendingMode = AddStatItem("Sending Mode"); + _processedPackets = AddStatItem("Processed Packets"); _processedPacketsElements = AddStatItem("Processed Packets Elements"); _processedPacketsEntities = AddStatItem("Processed Packets Entities"); _processedPacketsTiming = AddStatItem("Processed Packets Timing"); @@ -219,6 +220,8 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { // Processed Packets Elements auto averageElementsPerPacket = entities->getAverageElementsPerPacket(); auto averageEntitiesPerPacket = entities->getAverageEntitiesPerPacket(); + + auto averagePacketsPerSecond = entities->getAveragePacketsPerSecond(); auto averageElementsPerSecond = entities->getAverageElementsPerSecond(); auto averageEntitiesPerSecond = entities->getAverageEntitiesPerSecond(); @@ -228,6 +231,8 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { QString averageElementsPerPacketString = locale.toString(averageElementsPerPacket); QString averageEntitiesPerPacketString = locale.toString(averageEntitiesPerPacket); + + QString averagePacketsPerSecondString = locale.toString(averagePacketsPerSecond); QString averageElementsPerSecondString = locale.toString(averageElementsPerSecond); QString averageEntitiesPerSecondString = locale.toString(averageEntitiesPerSecond); @@ -235,6 +240,13 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { QString averageUncompressPerPacketString = locale.toString(averageUncompressPerPacket); QString averageReadBitstreamPerPacketString = locale.toString(averageReadBitstreamPerPacket); + label = _labels[_processedPackets]; + statsValue.str(""); + statsValue << + "" << qPrintable(averagePacketsPerSecondString) << " per second"; + + label->setText(statsValue.str().c_str()); + label = _labels[_processedPacketsElements]; statsValue.str(""); statsValue << diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index 986080de56..f56a00bc86 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -66,6 +66,7 @@ private: int _entityUpdateTime; int _entityUpdates; + int _processedPackets; int _processedPacketsElements; int _processedPacketsEntities; int _processedPacketsTiming; diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index 6fa3f47120..d0aebd216e 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -101,6 +101,8 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar sequence, flightTime, packetLength, dataBytes); } + _packetsInLastWindow++; + int elementsPerPacket = 0; int entitiesPerPacket = 0; @@ -185,12 +187,15 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar const quint64 USECS_PER_SECOND = 1000 * 1000; if (sinceLastWindow > USECS_PER_SECOND) { + float packetsPerSecondInWindow = (float)_packetsInLastWindow / (float)(sinceLastWindow / USECS_PER_SECOND); float elementsPerSecondInWindow = (float)_elementsInLastWindow / (float)(sinceLastWindow / USECS_PER_SECOND); float entitiesPerSecondInWindow = (float)_entitiesInLastWindow / (float)(sinceLastWindow / USECS_PER_SECOND); + _packetsPerSecond.updateAverage(packetsPerSecondInWindow); _elementsPerSecond.updateAverage(elementsPerSecondInWindow); _entitiesPerSecond.updateAverage(entitiesPerSecondInWindow); _lastWindowAt = now; + _packetsInLastWindow = 0; _elementsInLastWindow = 0; _entitiesInLastWindow = 0; } diff --git a/libraries/octree/src/OctreeRenderer.h b/libraries/octree/src/OctreeRenderer.h index 894e5c2355..cf3b2a2ecd 100644 --- a/libraries/octree/src/OctreeRenderer.h +++ b/libraries/octree/src/OctreeRenderer.h @@ -64,6 +64,7 @@ public: float getAverageElementsPerPacket() const { return _elementsPerPacket.getAverage(); } float getAverageEntitiesPerPacket() const { return _entitiesPerPacket.getAverage(); } + float getAveragePacketsPerSecond() const { return _packetsPerSecond.getAverage(); } float getAverageElementsPerSecond() const { return _elementsPerSecond.getAverage(); } float getAverageEntitiesPerSecond() const { return _entitiesPerSecond.getAverage(); } @@ -80,6 +81,8 @@ protected: SimpleMovingAverage _elementsPerPacket; SimpleMovingAverage _entitiesPerPacket; + + SimpleMovingAverage _packetsPerSecond; SimpleMovingAverage _elementsPerSecond; SimpleMovingAverage _entitiesPerSecond; @@ -88,6 +91,7 @@ protected: SimpleMovingAverage _readBitstreamPerPacket; quint64 _lastWindowAt = 0; + int _packetsInLastWindow = 0; int _elementsInLastWindow = 0; int _entitiesInLastWindow = 0; From 74733452da2cdda7ead883bb680983f0ac809df2 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sat, 4 Jul 2015 11:25:27 -0700 Subject: [PATCH 09/10] some tweaks to make stats dialog more readable --- interface/src/Menu.cpp | 1 + interface/src/Menu.h | 1 + interface/src/ui/OctreeStatsDialog.cpp | 48 ++++++++++++++++---------- interface/src/ui/OctreeStatsDialog.h | 2 ++ 4 files changed, 33 insertions(+), 19 deletions(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index c70d11b837..9f49361f79 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -531,6 +531,7 @@ Menu::Menu() { addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::PipelineWarnings); addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::LogExtraTimings); addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::SuppressShortTimings); + addCheckableActionToQMenuAndActionHash(timingMenu, MenuOption::ShowRealtimeEntityStats); auto audioIO = DependencyManager::get(); MenuWrapper* audioDebugMenu = developerMenu->addMenu("Audio"); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index fae7092989..043bb53a7f 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -269,6 +269,7 @@ namespace MenuOption { const QString ShowDSConnectTable = "Show Domain Connection Timing"; const QString ShowBordersEntityNodes = "Show Entity Nodes"; const QString ShowIKConstraints = "Show IK Constraints"; + const QString ShowRealtimeEntityStats = "Show Realtime Entity Stats"; const QString SimpleShadows = "Simple"; const QString SixenseEnabled = "Enable Hydra Support"; const QString SixenseMouseInput = "Enable Sixense Mouse Input"; diff --git a/interface/src/ui/OctreeStatsDialog.cpp b/interface/src/ui/OctreeStatsDialog.cpp index eea962b412..94f91a5ab7 100644 --- a/interface/src/ui/OctreeStatsDialog.cpp +++ b/interface/src/ui/OctreeStatsDialog.cpp @@ -129,6 +129,34 @@ OctreeStatsDialog::~OctreeStatsDialog() { void OctreeStatsDialog::paintEvent(QPaintEvent* event) { + // Processed Entities Related stats + auto entities = Application::getInstance()->getEntities(); + auto entitiesTree = entities->getTree(); + + // Do this ever paint event... even if we don't update + auto totalTrackedEdits = entitiesTree->getTotalTrackedEdits(); + + // track our updated per second + const quint64 SAMPLING_WINDOW = USECS_PER_SECOND / SAMPLES_PER_SECOND; + quint64 now = usecTimestampNow(); + quint64 sinceLastWindow = now - _lastWindowAt; + auto editsInLastWindow = totalTrackedEdits - _lastKnownTrackedEdits; + float sinceLastWindowInSeconds = (float)sinceLastWindow / (float)USECS_PER_SECOND; + float recentUpdatesPerSecond = (float)editsInLastWindow / sinceLastWindowInSeconds; + if (sinceLastWindow > SAMPLING_WINDOW) { + _averageUpdatesPerSecond.updateAverage(recentUpdatesPerSecond); + _lastWindowAt = now; + _lastKnownTrackedEdits = totalTrackedEdits; + } + + // Only refresh our stats every once in a while, unless asked for realtime + quint64 REFRESH_AFTER = Menu::getInstance()->isOptionChecked(MenuOption::ShowRealtimeEntityStats) ? 0 : USECS_PER_SECOND; + quint64 sinceLastRefresh = now - _lastRefresh; + if (sinceLastRefresh < REFRESH_AFTER) { + return QDialog::paintEvent(event); + } + _lastRefresh = now; + // Update labels QLabel* label; @@ -213,10 +241,6 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { "Leaves: " << qPrintable(serversLeavesString) << ""; label->setText(statsValue.str().c_str()); - // Processed Entities Related stats - auto entities = Application::getInstance()->getEntities(); - auto entitiesTree = entities->getTree(); - // Processed Packets Elements auto averageElementsPerPacket = entities->getAverageElementsPerPacket(); auto averageEntitiesPerPacket = entities->getAverageEntitiesPerPacket(); @@ -289,22 +313,8 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { // Entity Edits label = _labels[_entityUpdates]; - auto totalTrackedEdits = entitiesTree->getTotalTrackedEdits(); auto bytesPerEdit = entitiesTree->getAverageEditBytes(); - // track our updated per second - const quint64 SAMPLING_WINDOW = USECS_PER_SECOND / SAMPLES_PER_SECOND; - quint64 now = usecTimestampNow(); - quint64 sinceLastWindow = now - _lastWindowAt; - auto editsInLastWindow = totalTrackedEdits - _lastKnownTrackedEdits; - float sinceLastWindowInSeconds = (float)sinceLastWindow / (float)USECS_PER_SECOND; - float recentUpdatesPerSecond = (float)editsInLastWindow / sinceLastWindowInSeconds; - if (sinceLastWindow > SAMPLING_WINDOW) { - _averageUpdatesPerSecond.updateAverage(recentUpdatesPerSecond); - _lastWindowAt = now; - _lastKnownTrackedEdits = totalTrackedEdits; - } - auto updatesPerSecond = _averageUpdatesPerSecond.getAverage(); if (updatesPerSecond < 1) { updatesPerSecond = 0; // we don't really care about small updates per second so suppress those @@ -324,7 +334,7 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) { showAllOctreeServers(); - this->QDialog::paintEvent(event); + QDialog::paintEvent(event); } void OctreeStatsDialog::showAllOctreeServers() { int serverCount = 0; diff --git a/interface/src/ui/OctreeStatsDialog.h b/interface/src/ui/OctreeStatsDialog.h index f56a00bc86..063c04b295 100644 --- a/interface/src/ui/OctreeStatsDialog.h +++ b/interface/src/ui/OctreeStatsDialog.h @@ -76,6 +76,8 @@ private: quint64 _lastWindowAt = 0; quint64 _lastKnownTrackedEdits = 0; + quint64 _lastRefresh = 0; + int _octreeServerLables[MAX_VOXEL_SERVERS]; int _octreeServerLabelsCount; details _extraServerDetails[MAX_VOXEL_SERVERS]; From c4a5160b890260f75f21e99e88e6f9e8267fc43e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Sat, 4 Jul 2015 19:13:35 -0700 Subject: [PATCH 10/10] CR feedback --- libraries/octree/src/OctreeRenderer.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libraries/octree/src/OctreeRenderer.cpp b/libraries/octree/src/OctreeRenderer.cpp index d0aebd216e..c4534b2565 100644 --- a/libraries/octree/src/OctreeRenderer.cpp +++ b/libraries/octree/src/OctreeRenderer.cpp @@ -12,9 +12,11 @@ #include #include -#include +#include #include #include +#include + #include "OctreeLogging.h" #include "OctreeRenderer.h" @@ -185,7 +187,6 @@ void OctreeRenderer::processDatagram(const QByteArray& dataByteArray, const Shar } quint64 sinceLastWindow = now - _lastWindowAt; - const quint64 USECS_PER_SECOND = 1000 * 1000; if (sinceLastWindow > USECS_PER_SECOND) { float packetsPerSecondInWindow = (float)_packetsInLastWindow / (float)(sinceLastWindow / USECS_PER_SECOND); float elementsPerSecondInWindow = (float)_elementsInLastWindow / (float)(sinceLastWindow / USECS_PER_SECOND);