mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 10:29:01 +02:00
Merge pull request #5263 from ZappoMan/inBoundStats
Additional inbound entity stats
This commit is contained in:
commit
bd938d5f4c
3 changed files with 59 additions and 10 deletions
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include "Application.h"
|
#include "Application.h"
|
||||||
|
|
||||||
|
#include "../octree/OctreePacketProcessor.h"
|
||||||
#include "ui/OctreeStatsDialog.h"
|
#include "ui/OctreeStatsDialog.h"
|
||||||
|
|
||||||
OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* model) :
|
OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* model) :
|
||||||
|
@ -53,7 +54,7 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo
|
||||||
_localElementsMemory = AddStatItem("Elements Memory");
|
_localElementsMemory = AddStatItem("Elements Memory");
|
||||||
_sendingMode = AddStatItem("Sending Mode");
|
_sendingMode = AddStatItem("Sending Mode");
|
||||||
|
|
||||||
_processedPackets = AddStatItem("Processed Packets");
|
_processedPackets = AddStatItem("Entity Packets");
|
||||||
_processedPacketsElements = AddStatItem("Processed Packets Elements");
|
_processedPacketsElements = AddStatItem("Processed Packets Elements");
|
||||||
_processedPacketsEntities = AddStatItem("Processed Packets Entities");
|
_processedPacketsEntities = AddStatItem("Processed Packets Entities");
|
||||||
_processedPacketsTiming = AddStatItem("Processed Packets Timing");
|
_processedPacketsTiming = AddStatItem("Processed Packets Timing");
|
||||||
|
@ -155,6 +156,8 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) {
|
||||||
if (sinceLastRefresh < REFRESH_AFTER) {
|
if (sinceLastRefresh < REFRESH_AFTER) {
|
||||||
return QDialog::paintEvent(event);
|
return QDialog::paintEvent(event);
|
||||||
}
|
}
|
||||||
|
const int FLOATING_POINT_PRECISION = 3;
|
||||||
|
|
||||||
_lastRefresh = now;
|
_lastRefresh = now;
|
||||||
|
|
||||||
// Update labels
|
// Update labels
|
||||||
|
@ -245,7 +248,6 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) {
|
||||||
auto averageElementsPerPacket = entities->getAverageElementsPerPacket();
|
auto averageElementsPerPacket = entities->getAverageElementsPerPacket();
|
||||||
auto averageEntitiesPerPacket = entities->getAverageEntitiesPerPacket();
|
auto averageEntitiesPerPacket = entities->getAverageEntitiesPerPacket();
|
||||||
|
|
||||||
auto averagePacketsPerSecond = entities->getAveragePacketsPerSecond();
|
|
||||||
auto averageElementsPerSecond = entities->getAverageElementsPerSecond();
|
auto averageElementsPerSecond = entities->getAverageElementsPerSecond();
|
||||||
auto averageEntitiesPerSecond = entities->getAverageEntitiesPerSecond();
|
auto averageEntitiesPerSecond = entities->getAverageEntitiesPerSecond();
|
||||||
|
|
||||||
|
@ -253,21 +255,32 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) {
|
||||||
auto averageUncompressPerPacket = entities->getAverageUncompressPerPacket();
|
auto averageUncompressPerPacket = entities->getAverageUncompressPerPacket();
|
||||||
auto averageReadBitstreamPerPacket = entities->getAverageReadBitstreamPerPacket();
|
auto averageReadBitstreamPerPacket = entities->getAverageReadBitstreamPerPacket();
|
||||||
|
|
||||||
QString averageElementsPerPacketString = locale.toString(averageElementsPerPacket);
|
QString averageElementsPerPacketString = locale.toString(averageElementsPerPacket, 'f', FLOATING_POINT_PRECISION);
|
||||||
QString averageEntitiesPerPacketString = locale.toString(averageEntitiesPerPacket);
|
QString averageEntitiesPerPacketString = locale.toString(averageEntitiesPerPacket, 'f', FLOATING_POINT_PRECISION);
|
||||||
|
|
||||||
QString averagePacketsPerSecondString = locale.toString(averagePacketsPerSecond);
|
QString averageElementsPerSecondString = locale.toString(averageElementsPerSecond, 'f', FLOATING_POINT_PRECISION);
|
||||||
QString averageElementsPerSecondString = locale.toString(averageElementsPerSecond);
|
QString averageEntitiesPerSecondString = locale.toString(averageEntitiesPerSecond, 'f', FLOATING_POINT_PRECISION);
|
||||||
QString averageEntitiesPerSecondString = locale.toString(averageEntitiesPerSecond);
|
|
||||||
|
|
||||||
QString averageWaitLockPerPacketString = locale.toString(averageWaitLockPerPacket);
|
QString averageWaitLockPerPacketString = locale.toString(averageWaitLockPerPacket);
|
||||||
QString averageUncompressPerPacketString = locale.toString(averageUncompressPerPacket);
|
QString averageUncompressPerPacketString = locale.toString(averageUncompressPerPacket);
|
||||||
QString averageReadBitstreamPerPacketString = locale.toString(averageReadBitstreamPerPacket);
|
QString averageReadBitstreamPerPacketString = locale.toString(averageReadBitstreamPerPacket);
|
||||||
|
|
||||||
label = _labels[_processedPackets];
|
label = _labels[_processedPackets];
|
||||||
|
const OctreePacketProcessor& entitiesPacketProcessor = Application::getInstance()->getOctreePacketProcessor();
|
||||||
|
|
||||||
|
auto incomingPPS = entitiesPacketProcessor.getIncomingPPS();
|
||||||
|
auto processedPPS = entitiesPacketProcessor.getProcessedPPS();
|
||||||
|
auto treeProcessedPPS = entities->getAveragePacketsPerSecond();
|
||||||
|
|
||||||
|
QString incomingPPSString = locale.toString(incomingPPS, 'f', FLOATING_POINT_PRECISION);
|
||||||
|
QString processedPPSString = locale.toString(processedPPS, 'f', FLOATING_POINT_PRECISION);
|
||||||
|
QString treeProcessedPPSString = locale.toString(treeProcessedPPS, 'f', FLOATING_POINT_PRECISION);
|
||||||
|
|
||||||
statsValue.str("");
|
statsValue.str("");
|
||||||
statsValue <<
|
statsValue <<
|
||||||
"" << qPrintable(averagePacketsPerSecondString) << " per second";
|
"Network IN: " << qPrintable(incomingPPSString) << " PPS / " <<
|
||||||
|
"Queue OUT: " << qPrintable(processedPPSString) << " PPS / " <<
|
||||||
|
"Tree IN: " << qPrintable(treeProcessedPPSString) << " PPS";
|
||||||
|
|
||||||
label->setText(statsValue.str().c_str());
|
label->setText(statsValue.str().c_str());
|
||||||
|
|
||||||
|
@ -321,7 +334,7 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
QString totalTrackedEditsString = locale.toString((uint)totalTrackedEdits);
|
QString totalTrackedEditsString = locale.toString((uint)totalTrackedEdits);
|
||||||
QString updatesPerSecondString = locale.toString(updatesPerSecond);
|
QString updatesPerSecondString = locale.toString(updatesPerSecond, 'f', FLOATING_POINT_PRECISION);
|
||||||
QString bytesPerEditString = locale.toString(bytesPerEdit);
|
QString bytesPerEditString = locale.toString(bytesPerEdit);
|
||||||
|
|
||||||
statsValue.str("");
|
statsValue.str("");
|
||||||
|
|
|
@ -9,10 +9,17 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <NumericalConstants.h>
|
||||||
|
|
||||||
#include "NodeList.h"
|
#include "NodeList.h"
|
||||||
#include "ReceivedPacketProcessor.h"
|
#include "ReceivedPacketProcessor.h"
|
||||||
#include "SharedUtil.h"
|
#include "SharedUtil.h"
|
||||||
|
|
||||||
|
ReceivedPacketProcessor::ReceivedPacketProcessor() {
|
||||||
|
_lastWindowAt = usecTimestampNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void ReceivedPacketProcessor::terminating() {
|
void ReceivedPacketProcessor::terminating() {
|
||||||
_hasPackets.wakeAll();
|
_hasPackets.wakeAll();
|
||||||
}
|
}
|
||||||
|
@ -25,6 +32,7 @@ void ReceivedPacketProcessor::queueReceivedPacket(const SharedNodePointer& sendi
|
||||||
lock();
|
lock();
|
||||||
_packets.push_back(networkPacket);
|
_packets.push_back(networkPacket);
|
||||||
_nodePacketCounts[sendingNode->getUUID()]++;
|
_nodePacketCounts[sendingNode->getUUID()]++;
|
||||||
|
_lastWindowIncomingPackets++;
|
||||||
unlock();
|
unlock();
|
||||||
|
|
||||||
// Make sure to wake our actual processing thread because we now have packets for it to process.
|
// Make sure to wake our actual processing thread because we now have packets for it to process.
|
||||||
|
@ -32,6 +40,24 @@ void ReceivedPacketProcessor::queueReceivedPacket(const SharedNodePointer& sendi
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReceivedPacketProcessor::process() {
|
bool ReceivedPacketProcessor::process() {
|
||||||
|
quint64 now = usecTimestampNow();
|
||||||
|
quint64 sinceLastWindow = now - _lastWindowAt;
|
||||||
|
|
||||||
|
|
||||||
|
if (sinceLastWindow > USECS_PER_SECOND) {
|
||||||
|
lock();
|
||||||
|
float secondsSinceLastWindow = sinceLastWindow / USECS_PER_SECOND;
|
||||||
|
float incomingPacketsPerSecondInWindow = (float)_lastWindowIncomingPackets / secondsSinceLastWindow;
|
||||||
|
_incomingPPS.updateAverage(incomingPacketsPerSecondInWindow);
|
||||||
|
|
||||||
|
float processedPacketsPerSecondInWindow = (float)_lastWindowIncomingPackets / secondsSinceLastWindow;
|
||||||
|
_processedPPS.updateAverage(processedPacketsPerSecondInWindow);
|
||||||
|
|
||||||
|
_lastWindowAt = now;
|
||||||
|
_lastWindowIncomingPackets = 0;
|
||||||
|
_lastWindowProcessedPackets = 0;
|
||||||
|
unlock();
|
||||||
|
}
|
||||||
|
|
||||||
if (_packets.size() == 0) {
|
if (_packets.size() == 0) {
|
||||||
_waitingOnPacketsMutex.lock();
|
_waitingOnPacketsMutex.lock();
|
||||||
|
@ -51,6 +77,7 @@ bool ReceivedPacketProcessor::process() {
|
||||||
|
|
||||||
foreach(auto& packet, currentPackets) {
|
foreach(auto& packet, currentPackets) {
|
||||||
processPacket(packet.getNode(), packet.getByteArray());
|
processPacket(packet.getNode(), packet.getByteArray());
|
||||||
|
_lastWindowProcessedPackets++;
|
||||||
midProcess();
|
midProcess();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
class ReceivedPacketProcessor : public GenericThread {
|
class ReceivedPacketProcessor : public GenericThread {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
ReceivedPacketProcessor() { }
|
ReceivedPacketProcessor();
|
||||||
|
|
||||||
/// Add packet from network receive thread to the processing queue.
|
/// Add packet from network receive thread to the processing queue.
|
||||||
void queueReceivedPacket(const SharedNodePointer& sendingNode, const QByteArray& packet);
|
void queueReceivedPacket(const SharedNodePointer& sendingNode, const QByteArray& packet);
|
||||||
|
@ -47,6 +47,9 @@ public:
|
||||||
/// How many received packets waiting are to be processed
|
/// How many received packets waiting are to be processed
|
||||||
int packetsToProcessCount() const { return _packets.size(); }
|
int packetsToProcessCount() const { return _packets.size(); }
|
||||||
|
|
||||||
|
float getIncomingPPS() const { return _incomingPPS.getAverage(); }
|
||||||
|
float getProcessedPPS() const { return _processedPPS.getAverage(); }
|
||||||
|
|
||||||
virtual void terminating();
|
virtual void terminating();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
@ -80,6 +83,12 @@ protected:
|
||||||
|
|
||||||
QWaitCondition _hasPackets;
|
QWaitCondition _hasPackets;
|
||||||
QMutex _waitingOnPacketsMutex;
|
QMutex _waitingOnPacketsMutex;
|
||||||
|
|
||||||
|
quint64 _lastWindowAt = 0;
|
||||||
|
int _lastWindowIncomingPackets = 0;
|
||||||
|
int _lastWindowProcessedPackets = 0;
|
||||||
|
SimpleMovingAverage _incomingPPS;
|
||||||
|
SimpleMovingAverage _processedPPS;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_ReceivedPacketProcessor_h
|
#endif // hifi_ReceivedPacketProcessor_h
|
||||||
|
|
Loading…
Reference in a new issue