mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 13:58:51 +02:00
Update Octree server stats to handle single server
This commit is contained in:
parent
28f164d7e5
commit
06e2f394f9
5 changed files with 234 additions and 300 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue