Update Octree server stats to handle single server

This commit is contained in:
Atlante45 2017-12-04 17:12:09 -08:00
parent 28f164d7e5
commit 06e2f394f9
5 changed files with 234 additions and 300 deletions

View file

@ -154,90 +154,86 @@ Rectangle {
color: OctreeStats.getColor() color: OctreeStats.getColor()
} }
Repeater { Column {
model: OctreeStats.serversNum id: serverColumn
width: scrollView.width - 10
x: 5
spacing: 5
delegate: Column { state: "less"
id: serverColumn
width: scrollView.width - 10
x: 5
spacing: 5
state: "less" TabletEntityStatisticsItem {
id: serverStats
width: parent.width
titleText: qsTr("Entity Server") + ":"
colorScheme: root.colorScheme
color: OctreeStats.getColor()
}
TabletEntityStatisticsItem { Row {
id: serverStats id: buttonsRow
width: parent.width width: parent.width
titleText: qsTr("Entity Server ") + (index+1) + ":" height: 30
spacing: 10
HifiControls.Button {
id: moreButton
color: hifi.buttons.blue
colorScheme: root.colorScheme colorScheme: root.colorScheme
color: OctreeStats.getColor() width: parent.width / 2 - 10
}
Row {
id: buttonsRow
width: parent.width
height: 30 height: 30
spacing: 10 onClicked: {
if (serverColumn.state === "less") {
HifiControls.Button { serverColumn.state = "more"
id: moreButton } else if (serverColumn.state === "more") {
color: hifi.buttons.blue serverColumn.state = "most"
colorScheme: root.colorScheme } else {
width: parent.width / 2 - 10 serverColumn.state = "more"
height: 30
onClicked: {
if (serverColumn.state === "less") {
serverColumn.state = "more"
} else if (serverColumn.state === "more") {
serverColumn.state = "most"
} else {
serverColumn.state = "more"
}
} }
} }
HifiControls.Button {
id: mostButton
color: hifi.buttons.blue
colorScheme: root.colorScheme
height: 30
width: parent.width / 2 - 10
onClicked: {
if (serverColumn.state === "less") {
serverColumn.state = "most"
} else if (serverColumn.state === "more") {
serverColumn.state = "less"
} else {
serverColumn.state = "less"
}
}
}
} }
states: [ HifiControls.Button {
State { id: mostButton
name: "less" color: hifi.buttons.blue
PropertyChanges { target: moreButton; text: qsTr("more..."); } colorScheme: root.colorScheme
PropertyChanges { target: mostButton; text: qsTr("most..."); } height: 30
PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3]; } width: parent.width / 2 - 10
}, onClicked: {
State { if (serverColumn.state === "less") {
name: "more" serverColumn.state = "most"
PropertyChanges { target: moreButton; text: qsTr("most..."); } } else if (serverColumn.state === "more") {
PropertyChanges { target: mostButton; text: qsTr("less..."); } serverColumn.state = "less"
PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3] + } else {
OctreeStats.servers[index*3 + 1]; } serverColumn.state = "less"
}, }
State {
name: "most"
PropertyChanges { target: moreButton; text: qsTr("less..."); }
PropertyChanges { target: mostButton; text: qsTr("least..."); }
PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3] +
OctreeStats.servers[index*3 + 1] +
OctreeStats.servers[index*3 + 2]; }
} }
]
} //servers column }
} //repeater }
states: [
State {
name: "less"
PropertyChanges { target: moreButton; text: qsTr("more..."); }
PropertyChanges { target: mostButton; text: qsTr("most..."); }
PropertyChanges { target: serverStats; text: OctreeStats.servers[0]; }
},
State {
name: "more"
PropertyChanges { target: moreButton; text: qsTr("most..."); }
PropertyChanges { target: mostButton; text: qsTr("less..."); }
PropertyChanges { target: serverStats; text: OctreeStats.servers[0] +
OctreeStats.servers[1]; }
},
State {
name: "most"
PropertyChanges { target: moreButton; text: qsTr("less..."); }
PropertyChanges { target: mostButton; text: qsTr("least..."); }
PropertyChanges { target: serverStats; text: OctreeStats.servers[0] +
OctreeStats.servers[1] +
OctreeStats.servers[2]; }
}
]
} //servers column
} //column } //column
} //flickable } //flickable
} }

View file

@ -26,27 +26,17 @@
OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* model) : OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* model) :
QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint), QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint),
_model(model), _model(model)
_averageUpdatesPerSecond(SAMPLES_PER_SECOND)
{ {
_statCount = 0;
_octreeServerLabelsCount = 0;
for (int i = 0; i < MAX_VOXEL_SERVERS; i++) {
_octreeServerLables[i] = 0;
_extraServerDetails[i] = LESS;
}
for (int i = 0; i < MAX_STATS; i++) { for (int i = 0; i < MAX_STATS; i++) {
_labels[i] = NULL; _labels[i] = nullptr;
} }
this->setWindowTitle("Octree Server Statistics"); setWindowTitle("Octree Server Statistics");
// Create layouter // Create layouter
_form = new QFormLayout(); _form = new QFormLayout();
this->QDialog::setLayout(_form); setLayout(_form);
// Setup stat items // Setup stat items
_serverElements = AddStatItem("Elements on Servers"); _serverElements = AddStatItem("Elements on Servers");
@ -63,7 +53,14 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo
_entityUpdateTime = AddStatItem("Entity Update Time"); _entityUpdateTime = AddStatItem("Entity Update Time");
_entityUpdates = AddStatItem("Entity Updates"); _entityUpdates = AddStatItem("Entity Updates");
_octreeServerLabel = AddStatItem("Entity Server");
_labels[_octreeServerLabel]->setTextFormat(Qt::RichText);
_labels[_octreeServerLabel]->setTextInteractionFlags(Qt::TextBrowserInteraction);
connect(_labels[_octreeServerLabel], SIGNAL(linkActivated(const QString&)),
this, SLOT(moreless(const QString&)));
layout()->setSizeConstraint(QLayout::SetFixedSize); layout()->setSizeConstraint(QLayout::SetFixedSize);
} }
@ -74,23 +71,16 @@ void OctreeStatsDialog::RemoveStatItem(int item) {
_form->removeWidget(automaticLabel); _form->removeWidget(automaticLabel);
automaticLabel->deleteLater(); automaticLabel->deleteLater();
myLabel->deleteLater(); myLabel->deleteLater();
_labels[item] = NULL; _labels[item] = nullptr;
} }
void OctreeStatsDialog::moreless(const QString& link) { void OctreeStatsDialog::moreless(const QString& link) {
QStringList linkDetails = link.split("-"); if (link == "more") {
const int COMMAND_ITEM = 0; _extraServerDetails = MORE;
const int SERVER_NUMBER_ITEM = 1; } else if (link == "most") {
QString serverNumberString = linkDetails[SERVER_NUMBER_ITEM]; _extraServerDetails = MOST;
QString command = linkDetails[COMMAND_ITEM];
int serverNumber = serverNumberString.toInt();
if (command == "more") {
_extraServerDetails[serverNumber-1] = MORE;
} else if (command == "most") {
_extraServerDetails[serverNumber-1] = MOST;
} else { } else {
_extraServerDetails[serverNumber-1] = LESS; _extraServerDetails = LESS;
} }
} }
@ -376,60 +366,34 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) {
QDialog::paintEvent(event); QDialog::paintEvent(event);
} }
void OctreeStatsDialog::showAllOctreeServers() { void OctreeStatsDialog::showAllOctreeServers() {
int serverCount = 0; showOctreeServersOfType(NodeType::EntityServer);
showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity");
if (_octreeServerLabelsCount > serverCount) {
for (int i = serverCount; i < _octreeServerLabelsCount; i++) {
int serverLabel = _octreeServerLables[i];
RemoveStatItem(serverLabel);
_octreeServerLables[i] = 0;
}
_octreeServerLabelsCount = serverCount;
}
} }
void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName) { void OctreeStatsDialog::showOctreeServersOfType(NodeType_t serverType) {
QLocale locale(QLocale::English); QLocale locale(QLocale::English);
auto nodeList = DependencyManager::get<NodeList>(); auto node = DependencyManager::get<NodeList>()->soloNodeOfType(serverType);
nodeList->eachNode([&](const SharedNodePointer& node){ if (node) {
std::stringstream serverDetails("");
// only send to the NodeTypes that are NodeType_t_VOXEL_SERVER std::stringstream extraDetails("");
if (node->getType() == serverType) { std::stringstream linkDetails("");
serverCount++;
if (serverCount > _octreeServerLabelsCount) {
QString label = QString("%1 Server %2").arg(serverTypeName).arg(serverCount);
int thisServerRow = _octreeServerLables[serverCount-1] = AddStatItem(label.toUtf8().constData());
_labels[thisServerRow]->setTextFormat(Qt::RichText);
_labels[thisServerRow]->setTextInteractionFlags(Qt::TextBrowserInteraction);
connect(_labels[thisServerRow], SIGNAL(linkActivated(const QString&)), this, SLOT(moreless(const QString&)));
_octreeServerLabelsCount++;
}
std::stringstream serverDetails("");
std::stringstream extraDetails("");
std::stringstream linkDetails("");
if (node->getActiveSocket()) {
serverDetails << "active ";
} else {
serverDetails << "inactive ";
}
QUuid nodeUUID = node->getUUID();
// now lookup stats details for this server...
if (_extraServerDetails[serverCount-1] != LESS) {
NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats();
sceneStats->withReadLock([&] {
if (sceneStats->find(nodeUUID) != sceneStats->end()) {
OctreeSceneStats& stats = sceneStats->at(nodeUUID);
switch (_extraServerDetails[serverCount - 1]) { if (node->getActiveSocket()) {
serverDetails << "active ";
} else {
serverDetails << "inactive ";
}
QUuid nodeUUID = node->getUUID();
// now lookup stats details for this server...
if (_extraServerDetails != LESS) {
NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats();
sceneStats->withReadLock([&] {
if (sceneStats->find(nodeUUID) != sceneStats->end()) {
OctreeSceneStats& stats = sceneStats->at(nodeUUID);
switch (_extraServerDetails) {
case MOST: { case MOST: {
extraDetails << "<br/>"; extraDetails << "<br/>";
@ -507,7 +471,7 @@ void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t ser
" Average Ping Time: " << qPrintable(incomingPingTimeString) << " msecs"; " Average Ping Time: " << qPrintable(incomingPingTimeString) << " msecs";
serverDetails << "<br/>" << serverDetails << "<br/>" <<
" Average Clock Skew: " << qPrintable(incomingClockSkewString) << " msecs" << " Average Clock Skew: " << qPrintable(incomingClockSkewString) << " msecs" <<
" [" << qPrintable(formattedClockSkewString) << "]"; " [" << qPrintable(formattedClockSkewString) << "]";
@ -516,38 +480,37 @@ void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t ser
" Wasted Bytes: " << qPrintable(incomingWastedBytesString); " Wasted Bytes: " << qPrintable(incomingWastedBytesString);
serverDetails << extraDetails.str(); serverDetails << extraDetails.str();
if (_extraServerDetails[serverCount - 1] == MORE) { if (_extraServerDetails == MORE) {
linkDetails << " " << " [<a href='most-" << serverCount << "'>most...</a>]"; linkDetails << " [<a href='most'>most...</a>]";
linkDetails << " " << " [<a href='less-" << serverCount << "'>less...</a>]"; linkDetails << " [<a href='less'>less...</a>]";
} else { } else {
linkDetails << " " << " [<a href='more-" << serverCount << "'>less...</a>]"; linkDetails << " [<a href='more'>less...</a>]";
linkDetails << " " << " [<a href='less-" << serverCount << "'>least...</a>]"; linkDetails << " [<a href='less'>least...</a>]";
} }
} break; } break;
case LESS: { case LESS: {
// nothing // nothing
} break; } break;
}
} }
}); }
} else { });
linkDetails << " " << " [<a href='more-" << serverCount << "'>more...</a>]"; } else {
linkDetails << " " << " [<a href='most-" << serverCount << "'>most...</a>]"; linkDetails << " [<a href='more'>more...</a>]";
} linkDetails << " [<a href='most'>most...</a>]";
serverDetails << linkDetails.str(); }
_labels[_octreeServerLables[serverCount - 1]]->setText(serverDetails.str().c_str()); serverDetails << linkDetails.str();
} // is VOXEL_SERVER _labels[_octreeServerLabel]->setText(serverDetails.str().c_str());
}); }
} }
void OctreeStatsDialog::reject() { void OctreeStatsDialog::reject() {
// Just regularly close upon ESC // Just regularly close upon ESC
this->QDialog::close(); QDialog::close();
} }
void OctreeStatsDialog::closeEvent(QCloseEvent* event) { void OctreeStatsDialog::closeEvent(QCloseEvent* event) {
this->QDialog::closeEvent(event); QDialog::closeEvent(event);
emit closed(); emit closed();
} }

View file

@ -19,7 +19,6 @@
#include <OctreeSceneStats.h> #include <OctreeSceneStats.h>
#define MAX_STATS 100 #define MAX_STATS 100
#define MAX_VOXEL_SERVERS 50
#define DEFAULT_COLOR 0 #define DEFAULT_COLOR 0
class OctreeStatsDialog : public QDialog { class OctreeStatsDialog : public QDialog {
@ -47,18 +46,22 @@ protected:
void RemoveStatItem(int item); void RemoveStatItem(int item);
void showAllOctreeServers(); void showAllOctreeServers();
void showOctreeServersOfType(int& serverNumber, NodeType_t serverType, void showOctreeServersOfType(NodeType_t serverType);
const char* serverTypeName);
private: private:
enum details {
LESS,
MORE,
MOST
};
typedef enum { LESS, MORE, MOST } details; QFormLayout* _form { nullptr };
QFormLayout* _form;
QLabel* _labels[MAX_STATS]; QLabel* _labels[MAX_STATS];
NodeToOctreeSceneStats* _model; NodeToOctreeSceneStats* _model { nullptr };
int _statCount; int _statCount { 0 };
int _octreeServerLabel;
int _sendingMode; int _sendingMode;
int _serverElements; int _serverElements;
int _localElements; int _localElements;
@ -72,16 +75,14 @@ private:
int _processedPacketsTiming; int _processedPacketsTiming;
int _outboundEditPackets; int _outboundEditPackets;
const int SAMPLES_PER_SECOND = 10; const int SAMPLES_PER_SECOND { 10 };
SimpleMovingAverage _averageUpdatesPerSecond; SimpleMovingAverage _averageUpdatesPerSecond { SAMPLES_PER_SECOND };
quint64 _lastWindowAt = usecTimestampNow(); quint64 _lastWindowAt { usecTimestampNow() };
quint64 _lastKnownTrackedEdits = 0; quint64 _lastKnownTrackedEdits { 0 };
quint64 _lastRefresh = 0; quint64 _lastRefresh { 0 };
int _octreeServerLables[MAX_VOXEL_SERVERS]; details _extraServerDetails { LESS };
int _octreeServerLabelsCount;
details _extraServerDetails[MAX_VOXEL_SERVERS];
}; };
#endif // hifi_OctreeStatsDialog_h #endif // hifi_OctreeStatsDialog_h

View file

@ -16,9 +16,9 @@
OctreeStatsProvider::OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model) : OctreeStatsProvider::OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model) :
QObject(parent), QObject(parent),
_model(model) _model(model),
, _statCount(0) _statCount(0),
, _averageUpdatesPerSecond(SAMPLES_PER_SECOND) _averageUpdatesPerSecond(SAMPLES_PER_SECOND)
{ {
//schedule updates //schedule updates
connect(&_updateTimer, &QTimer::timeout, this, &OctreeStatsProvider::updateOctreeStatsData); connect(&_updateTimer, &QTimer::timeout, this, &OctreeStatsProvider::updateOctreeStatsData);
@ -57,10 +57,6 @@ OctreeStatsProvider::~OctreeStatsProvider() {
_updateTimer.stop(); _updateTimer.stop();
} }
int OctreeStatsProvider::serversNum() const {
return m_serversNum;
}
void OctreeStatsProvider::updateOctreeStatsData() { void OctreeStatsProvider::updateOctreeStatsData() {
// Processed Entities Related stats // Processed Entities Related stats
@ -237,110 +233,97 @@ void OctreeStatsProvider::updateOctreeStatsData() {
} }
void OctreeStatsProvider::updateOctreeServers() { void OctreeStatsProvider::updateOctreeServers() {
int serverCount = 0; showOctreeServersOfType(NodeType::EntityServer);
showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity");
if (m_serversNum != serverCount) {
m_serversNum = serverCount;
emit serversNumChanged(m_serversNum);
}
} }
void OctreeStatsProvider::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName) { void OctreeStatsProvider::showOctreeServersOfType(NodeType_t serverType) {
m_servers.clear(); m_servers.clear();
auto nodeList = DependencyManager::get<NodeList>(); auto node = DependencyManager::get<NodeList>()->soloNodeOfType(serverType);
nodeList->eachNode([&](const SharedNodePointer& node) { if (node) {
QString lesserDetails;
// only send to the NodeTypes that are NodeType_t_VOXEL_SERVER QString moreDetails;
if (node->getType() == serverType) { QString mostDetails;
serverCount++;
QString lesserDetails;
QString moreDetails;
QString mostDetails;
if (node->getActiveSocket()) {
lesserDetails += "active ";
} else {
lesserDetails += "inactive ";
}
QUuid nodeUUID = node->getUUID();
// now lookup stats details for this server... if (node->getActiveSocket()) {
NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats(); lesserDetails += "active ";
sceneStats->withReadLock([&] { } else {
if (sceneStats->find(nodeUUID) != sceneStats->end()) { lesserDetails += "inactive ";
OctreeSceneStats& stats = sceneStats->at(nodeUUID); }
float lastFullEncode = stats.getLastFullTotalEncodeTime() / USECS_PER_MSEC; QUuid nodeUUID = node->getUUID();
float lastFullSend = stats.getLastFullElapsedTime() / USECS_PER_MSEC;
float lastFullSendInSeconds = stats.getLastFullElapsedTime() / USECS_PER_SECOND;
float lastFullPackets = stats.getLastFullTotalPackets();
float lastFullPPS = lastFullPackets;
if (lastFullSendInSeconds > 0) {
lastFullPPS = lastFullPackets / lastFullSendInSeconds;
}
mostDetails += QString("<br/><br/>Last Full Scene... Encode: %1 ms Send: %2 ms Packets: %3 Bytes: %4 Rate: %5 PPS") // now lookup stats details for this server...
.arg(lastFullEncode) NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats();
.arg(lastFullSend) sceneStats->withReadLock([&] {
.arg(lastFullPackets) if (sceneStats->find(nodeUUID) != sceneStats->end()) {
.arg(stats.getLastFullTotalBytes()) OctreeSceneStats& stats = sceneStats->at(nodeUUID);
.arg(lastFullPPS);
for (int i = 0; i < OctreeSceneStats::ITEM_COUNT; i++) { float lastFullEncode = stats.getLastFullTotalEncodeTime() / USECS_PER_MSEC;
OctreeSceneStats::Item item = (OctreeSceneStats::Item)(i); float lastFullSend = stats.getLastFullElapsedTime() / USECS_PER_MSEC;
OctreeSceneStats::ItemInfo& itemInfo = stats.getItemInfo(item); float lastFullSendInSeconds = stats.getLastFullElapsedTime() / USECS_PER_SECOND;
mostDetails += QString("<br/> %1 %2") float lastFullPackets = stats.getLastFullTotalPackets();
.arg(itemInfo.caption).arg(stats.getItemValue(item)); float lastFullPPS = lastFullPackets;
} if (lastFullSendInSeconds > 0) {
lastFullPPS = lastFullPackets / lastFullSendInSeconds;
moreDetails += "<br/>Node UUID: " +nodeUUID.toString() + " ";
moreDetails += QString("<br/>Elements: %1 total %2 internal %3 leaves ")
.arg(stats.getTotalElements())
.arg(stats.getTotalInternal())
.arg(stats.getTotalLeaves());
const SequenceNumberStats& seqStats = stats.getIncomingOctreeSequenceNumberStats();
qint64 clockSkewInUsecs = node->getClockSkewUsec();
qint64 clockSkewInMS = clockSkewInUsecs / (qint64)USECS_PER_MSEC;
moreDetails += QString("<br/>Incoming Packets: %1/ Lost: %2/ Recovered: %3")
.arg(stats.getIncomingPackets())
.arg(seqStats.getLost())
.arg(seqStats.getRecovered());
moreDetails += QString("<br/> Out of Order: %1/ Early: %2/ Late: %3/ Unreasonable: %4")
.arg(seqStats.getOutOfOrder())
.arg(seqStats.getEarly())
.arg(seqStats.getLate())
.arg(seqStats.getUnreasonable());
moreDetails += QString("<br/> Average Flight Time: %1 msecs")
.arg(stats.getIncomingFlightTimeAverage());
moreDetails += QString("<br/> Average Ping Time: %1 msecs")
.arg(node->getPingMs());
moreDetails += QString("<br/> Average Clock Skew: %1 msecs [%2]")
.arg(clockSkewInMS)
.arg(formatUsecTime(clockSkewInUsecs));
moreDetails += QString("<br/>Incoming Bytes: %1 Wasted Bytes: %2")
.arg(stats.getIncomingBytes())
.arg(stats.getIncomingWastedBytes());
} }
});
m_servers.append(lesserDetails); mostDetails += QString("<br/><br/>Last Full Scene... Encode: %1 ms Send: %2 ms Packets: %3 Bytes: %4 Rate: %5 PPS")
m_servers.append(moreDetails); .arg(lastFullEncode)
m_servers.append(mostDetails); .arg(lastFullSend)
} // is VOXEL_SERVER .arg(lastFullPackets)
}); .arg(stats.getLastFullTotalBytes())
.arg(lastFullPPS);
for (int i = 0; i < OctreeSceneStats::ITEM_COUNT; i++) {
OctreeSceneStats::Item item = (OctreeSceneStats::Item)(i);
OctreeSceneStats::ItemInfo& itemInfo = stats.getItemInfo(item);
mostDetails += QString("<br/> %1 %2")
.arg(itemInfo.caption).arg(stats.getItemValue(item));
}
moreDetails += "<br/>Node UUID: " +nodeUUID.toString() + " ";
moreDetails += QString("<br/>Elements: %1 total %2 internal %3 leaves ")
.arg(stats.getTotalElements())
.arg(stats.getTotalInternal())
.arg(stats.getTotalLeaves());
const SequenceNumberStats& seqStats = stats.getIncomingOctreeSequenceNumberStats();
qint64 clockSkewInUsecs = node->getClockSkewUsec();
qint64 clockSkewInMS = clockSkewInUsecs / (qint64)USECS_PER_MSEC;
moreDetails += QString("<br/>Incoming Packets: %1/ Lost: %2/ Recovered: %3")
.arg(stats.getIncomingPackets())
.arg(seqStats.getLost())
.arg(seqStats.getRecovered());
moreDetails += QString("<br/> Out of Order: %1/ Early: %2/ Late: %3/ Unreasonable: %4")
.arg(seqStats.getOutOfOrder())
.arg(seqStats.getEarly())
.arg(seqStats.getLate())
.arg(seqStats.getUnreasonable());
moreDetails += QString("<br/> Average Flight Time: %1 msecs")
.arg(stats.getIncomingFlightTimeAverage());
moreDetails += QString("<br/> Average Ping Time: %1 msecs")
.arg(node->getPingMs());
moreDetails += QString("<br/> Average Clock Skew: %1 msecs [%2]")
.arg(clockSkewInMS)
.arg(formatUsecTime(clockSkewInUsecs));
moreDetails += QString("<br/>Incoming Bytes: %1 Wasted Bytes: %2")
.arg(stats.getIncomingBytes())
.arg(stats.getIncomingWastedBytes());
}
});
m_servers.append(lesserDetails);
m_servers.append(moreDetails);
m_servers.append(mostDetails);
}
emit serversChanged(m_servers); emit serversChanged(m_servers);
} }

View file

@ -18,15 +18,10 @@
#include "DependencyManager.h" #include "DependencyManager.h"
#define MAX_STATS 100
#define MAX_VOXEL_SERVERS 50
#define DEFAULT_COLOR 0
class OctreeStatsProvider : public QObject, public Dependency { class OctreeStatsProvider : public QObject, public Dependency {
Q_OBJECT Q_OBJECT
SINGLETON_DEPENDENCY SINGLETON_DEPENDENCY
Q_PROPERTY(int serversNum READ serversNum NOTIFY serversNumChanged)
Q_PROPERTY(QString serverElements READ serverElements NOTIFY serverElementsChanged) Q_PROPERTY(QString serverElements READ serverElements NOTIFY serverElementsChanged)
Q_PROPERTY(QString localElements READ localElements NOTIFY localElementsChanged) Q_PROPERTY(QString localElements READ localElements NOTIFY localElementsChanged)
Q_PROPERTY(QString localElementsMemory READ localElementsMemory NOTIFY localElementsMemoryChanged) Q_PROPERTY(QString localElementsMemory READ localElementsMemory NOTIFY localElementsMemoryChanged)
@ -45,8 +40,6 @@ public:
OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model); OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model);
~OctreeStatsProvider(); ~OctreeStatsProvider();
int serversNum() const;
QString serverElements() const { QString serverElements() const {
return m_serverElements; return m_serverElements;
} }
@ -96,8 +89,6 @@ public:
} }
signals: signals:
void serversNumChanged(int serversNum);
void serverElementsChanged(const QString &serverElements); void serverElementsChanged(const QString &serverElements);
void localElementsChanged(const QString &localElements); void localElementsChanged(const QString &localElements);
void sendingModeChanged(const QString &sendingMode); void sendingModeChanged(const QString &sendingMode);
@ -121,7 +112,7 @@ private slots:
void updateOctreeStatsData(); void updateOctreeStatsData();
protected: protected:
void updateOctreeServers(); void updateOctreeServers();
void showOctreeServersOfType(int& serverNumber, NodeType_t serverType, const char* serverTypeName); void showOctreeServersOfType(NodeType_t serverType);
private: private:
NodeToOctreeSceneStats* _model; NodeToOctreeSceneStats* _model;
@ -135,7 +126,7 @@ private:
quint64 _lastRefresh = 0; quint64 _lastRefresh = 0;
QTimer _updateTimer; QTimer _updateTimer;
int m_serversNum {0};
QString m_serverElements; QString m_serverElements;
QString m_localElements; QString m_localElements;
QString m_localElementsMemory; QString m_localElementsMemory;