mirror of
https://github.com/lubosz/overte.git
synced 2025-04-23 19:34:02 +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()
|
||||
}
|
||||
|
||||
Repeater {
|
||||
model: OctreeStats.serversNum
|
||||
Column {
|
||||
id: serverColumn
|
||||
width: scrollView.width - 10
|
||||
x: 5
|
||||
spacing: 5
|
||||
|
||||
delegate: Column {
|
||||
id: serverColumn
|
||||
width: scrollView.width - 10
|
||||
x: 5
|
||||
spacing: 5
|
||||
state: "less"
|
||||
|
||||
state: "less"
|
||||
TabletEntityStatisticsItem {
|
||||
id: serverStats
|
||||
width: parent.width
|
||||
titleText: qsTr("Entity Server") + ":"
|
||||
colorScheme: root.colorScheme
|
||||
color: OctreeStats.getColor()
|
||||
}
|
||||
|
||||
TabletEntityStatisticsItem {
|
||||
id: serverStats
|
||||
width: parent.width
|
||||
titleText: qsTr("Entity Server ") + (index+1) + ":"
|
||||
Row {
|
||||
id: buttonsRow
|
||||
width: parent.width
|
||||
height: 30
|
||||
spacing: 10
|
||||
|
||||
HifiControls.Button {
|
||||
id: moreButton
|
||||
color: hifi.buttons.blue
|
||||
colorScheme: root.colorScheme
|
||||
color: OctreeStats.getColor()
|
||||
}
|
||||
|
||||
Row {
|
||||
id: buttonsRow
|
||||
width: parent.width
|
||||
width: parent.width / 2 - 10
|
||||
height: 30
|
||||
spacing: 10
|
||||
|
||||
HifiControls.Button {
|
||||
id: moreButton
|
||||
color: hifi.buttons.blue
|
||||
colorScheme: root.colorScheme
|
||||
width: parent.width / 2 - 10
|
||||
height: 30
|
||||
onClicked: {
|
||||
if (serverColumn.state === "less") {
|
||||
serverColumn.state = "more"
|
||||
} else if (serverColumn.state === "more") {
|
||||
serverColumn.state = "most"
|
||||
} else {
|
||||
serverColumn.state = "more"
|
||||
}
|
||||
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: [
|
||||
State {
|
||||
name: "less"
|
||||
PropertyChanges { target: moreButton; text: qsTr("more..."); }
|
||||
PropertyChanges { target: mostButton; text: qsTr("most..."); }
|
||||
PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3]; }
|
||||
},
|
||||
State {
|
||||
name: "more"
|
||||
PropertyChanges { target: moreButton; text: qsTr("most..."); }
|
||||
PropertyChanges { target: mostButton; text: qsTr("less..."); }
|
||||
PropertyChanges { target: serverStats; text: OctreeStats.servers[index*3] +
|
||||
OctreeStats.servers[index*3 + 1]; }
|
||||
},
|
||||
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]; }
|
||||
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"
|
||||
}
|
||||
}
|
||||
]
|
||||
} //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
|
||||
} //flickable
|
||||
}
|
||||
|
|
|
@ -26,27 +26,17 @@
|
|||
|
||||
OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* model) :
|
||||
QDialog(parent, Qt::Window | Qt::WindowCloseButtonHint | Qt::WindowStaysOnTopHint),
|
||||
_model(model),
|
||||
_averageUpdatesPerSecond(SAMPLES_PER_SECOND)
|
||||
_model(model)
|
||||
{
|
||||
|
||||
_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++) {
|
||||
_labels[i] = NULL;
|
||||
_labels[i] = nullptr;
|
||||
}
|
||||
|
||||
this->setWindowTitle("Octree Server Statistics");
|
||||
setWindowTitle("Octree Server Statistics");
|
||||
|
||||
// Create layouter
|
||||
_form = new QFormLayout();
|
||||
this->QDialog::setLayout(_form);
|
||||
setLayout(_form);
|
||||
|
||||
// Setup stat items
|
||||
_serverElements = AddStatItem("Elements on Servers");
|
||||
|
@ -63,7 +53,14 @@ OctreeStatsDialog::OctreeStatsDialog(QWidget* parent, NodeToOctreeSceneStats* mo
|
|||
|
||||
_entityUpdateTime = AddStatItem("Entity Update Time");
|
||||
_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);
|
||||
}
|
||||
|
||||
|
@ -74,23 +71,16 @@ void OctreeStatsDialog::RemoveStatItem(int item) {
|
|||
_form->removeWidget(automaticLabel);
|
||||
automaticLabel->deleteLater();
|
||||
myLabel->deleteLater();
|
||||
_labels[item] = NULL;
|
||||
_labels[item] = nullptr;
|
||||
}
|
||||
|
||||
void OctreeStatsDialog::moreless(const QString& link) {
|
||||
QStringList linkDetails = link.split("-");
|
||||
const int COMMAND_ITEM = 0;
|
||||
const int SERVER_NUMBER_ITEM = 1;
|
||||
QString serverNumberString = linkDetails[SERVER_NUMBER_ITEM];
|
||||
QString command = linkDetails[COMMAND_ITEM];
|
||||
int serverNumber = serverNumberString.toInt();
|
||||
|
||||
if (command == "more") {
|
||||
_extraServerDetails[serverNumber-1] = MORE;
|
||||
} else if (command == "most") {
|
||||
_extraServerDetails[serverNumber-1] = MOST;
|
||||
if (link == "more") {
|
||||
_extraServerDetails = MORE;
|
||||
} else if (link == "most") {
|
||||
_extraServerDetails = MOST;
|
||||
} else {
|
||||
_extraServerDetails[serverNumber-1] = LESS;
|
||||
_extraServerDetails = LESS;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -376,60 +366,34 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) {
|
|||
QDialog::paintEvent(event);
|
||||
}
|
||||
void OctreeStatsDialog::showAllOctreeServers() {
|
||||
int serverCount = 0;
|
||||
|
||||
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;
|
||||
}
|
||||
showOctreeServersOfType(NodeType::EntityServer);
|
||||
}
|
||||
|
||||
void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName) {
|
||||
|
||||
void OctreeStatsDialog::showOctreeServersOfType(NodeType_t serverType) {
|
||||
QLocale locale(QLocale::English);
|
||||
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
nodeList->eachNode([&](const SharedNodePointer& node){
|
||||
|
||||
// only send to the NodeTypes that are NodeType_t_VOXEL_SERVER
|
||||
if (node->getType() == serverType) {
|
||||
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);
|
||||
auto node = DependencyManager::get<NodeList>()->soloNodeOfType(serverType);
|
||||
if (node) {
|
||||
std::stringstream serverDetails("");
|
||||
std::stringstream extraDetails("");
|
||||
std::stringstream linkDetails("");
|
||||
|
||||
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: {
|
||||
extraDetails << "<br/>";
|
||||
|
||||
|
@ -507,7 +471,7 @@ void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t ser
|
|||
" Average Ping Time: " << qPrintable(incomingPingTimeString) << " msecs";
|
||||
|
||||
serverDetails << "<br/>" <<
|
||||
" Average Clock Skew: " << qPrintable(incomingClockSkewString) << " msecs" <<
|
||||
" Average Clock Skew: " << qPrintable(incomingClockSkewString) << " msecs" <<
|
||||
" [" << qPrintable(formattedClockSkewString) << "]";
|
||||
|
||||
|
||||
|
@ -516,38 +480,37 @@ void OctreeStatsDialog::showOctreeServersOfType(int& serverCount, NodeType_t ser
|
|||
" Wasted Bytes: " << qPrintable(incomingWastedBytesString);
|
||||
|
||||
serverDetails << extraDetails.str();
|
||||
if (_extraServerDetails[serverCount - 1] == MORE) {
|
||||
linkDetails << " " << " [<a href='most-" << serverCount << "'>most...</a>]";
|
||||
linkDetails << " " << " [<a href='less-" << serverCount << "'>less...</a>]";
|
||||
if (_extraServerDetails == MORE) {
|
||||
linkDetails << " [<a href='most'>most...</a>]";
|
||||
linkDetails << " [<a href='less'>less...</a>]";
|
||||
} else {
|
||||
linkDetails << " " << " [<a href='more-" << serverCount << "'>less...</a>]";
|
||||
linkDetails << " " << " [<a href='less-" << serverCount << "'>least...</a>]";
|
||||
linkDetails << " [<a href='more'>less...</a>]";
|
||||
linkDetails << " [<a href='less'>least...</a>]";
|
||||
}
|
||||
|
||||
} break;
|
||||
case LESS: {
|
||||
// nothing
|
||||
} break;
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
linkDetails << " " << " [<a href='more-" << serverCount << "'>more...</a>]";
|
||||
linkDetails << " " << " [<a href='most-" << serverCount << "'>most...</a>]";
|
||||
}
|
||||
serverDetails << linkDetails.str();
|
||||
_labels[_octreeServerLables[serverCount - 1]]->setText(serverDetails.str().c_str());
|
||||
} // is VOXEL_SERVER
|
||||
});
|
||||
}
|
||||
});
|
||||
} else {
|
||||
linkDetails << " [<a href='more'>more...</a>]";
|
||||
linkDetails << " [<a href='most'>most...</a>]";
|
||||
}
|
||||
serverDetails << linkDetails.str();
|
||||
_labels[_octreeServerLabel]->setText(serverDetails.str().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void OctreeStatsDialog::reject() {
|
||||
// Just regularly close upon ESC
|
||||
this->QDialog::close();
|
||||
QDialog::close();
|
||||
}
|
||||
|
||||
void OctreeStatsDialog::closeEvent(QCloseEvent* event) {
|
||||
this->QDialog::closeEvent(event);
|
||||
QDialog::closeEvent(event);
|
||||
emit closed();
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <OctreeSceneStats.h>
|
||||
|
||||
#define MAX_STATS 100
|
||||
#define MAX_VOXEL_SERVERS 50
|
||||
#define DEFAULT_COLOR 0
|
||||
|
||||
class OctreeStatsDialog : public QDialog {
|
||||
|
@ -47,18 +46,22 @@ protected:
|
|||
void RemoveStatItem(int item);
|
||||
void showAllOctreeServers();
|
||||
|
||||
void showOctreeServersOfType(int& serverNumber, NodeType_t serverType,
|
||||
const char* serverTypeName);
|
||||
void showOctreeServersOfType(NodeType_t serverType);
|
||||
|
||||
private:
|
||||
enum details {
|
||||
LESS,
|
||||
MORE,
|
||||
MOST
|
||||
};
|
||||
|
||||
typedef enum { LESS, MORE, MOST } details;
|
||||
|
||||
QFormLayout* _form;
|
||||
QFormLayout* _form { nullptr };
|
||||
QLabel* _labels[MAX_STATS];
|
||||
NodeToOctreeSceneStats* _model;
|
||||
int _statCount;
|
||||
|
||||
NodeToOctreeSceneStats* _model { nullptr };
|
||||
int _statCount { 0 };
|
||||
|
||||
int _octreeServerLabel;
|
||||
|
||||
int _sendingMode;
|
||||
int _serverElements;
|
||||
int _localElements;
|
||||
|
@ -72,16 +75,14 @@ private:
|
|||
int _processedPacketsTiming;
|
||||
int _outboundEditPackets;
|
||||
|
||||
const int SAMPLES_PER_SECOND = 10;
|
||||
SimpleMovingAverage _averageUpdatesPerSecond;
|
||||
quint64 _lastWindowAt = usecTimestampNow();
|
||||
quint64 _lastKnownTrackedEdits = 0;
|
||||
const int SAMPLES_PER_SECOND { 10 };
|
||||
SimpleMovingAverage _averageUpdatesPerSecond { SAMPLES_PER_SECOND };
|
||||
quint64 _lastWindowAt { usecTimestampNow() };
|
||||
quint64 _lastKnownTrackedEdits { 0 };
|
||||
|
||||
quint64 _lastRefresh = 0;
|
||||
quint64 _lastRefresh { 0 };
|
||||
|
||||
int _octreeServerLables[MAX_VOXEL_SERVERS];
|
||||
int _octreeServerLabelsCount;
|
||||
details _extraServerDetails[MAX_VOXEL_SERVERS];
|
||||
details _extraServerDetails { LESS };
|
||||
};
|
||||
|
||||
#endif // hifi_OctreeStatsDialog_h
|
||||
|
|
|
@ -16,9 +16,9 @@
|
|||
|
||||
OctreeStatsProvider::OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model) :
|
||||
QObject(parent),
|
||||
_model(model)
|
||||
, _statCount(0)
|
||||
, _averageUpdatesPerSecond(SAMPLES_PER_SECOND)
|
||||
_model(model),
|
||||
_statCount(0),
|
||||
_averageUpdatesPerSecond(SAMPLES_PER_SECOND)
|
||||
{
|
||||
//schedule updates
|
||||
connect(&_updateTimer, &QTimer::timeout, this, &OctreeStatsProvider::updateOctreeStatsData);
|
||||
|
@ -57,10 +57,6 @@ OctreeStatsProvider::~OctreeStatsProvider() {
|
|||
_updateTimer.stop();
|
||||
}
|
||||
|
||||
int OctreeStatsProvider::serversNum() const {
|
||||
return m_serversNum;
|
||||
}
|
||||
|
||||
void OctreeStatsProvider::updateOctreeStatsData() {
|
||||
|
||||
// Processed Entities Related stats
|
||||
|
@ -237,110 +233,97 @@ void OctreeStatsProvider::updateOctreeStatsData() {
|
|||
}
|
||||
|
||||
void OctreeStatsProvider::updateOctreeServers() {
|
||||
int serverCount = 0;
|
||||
|
||||
showOctreeServersOfType(serverCount, NodeType::EntityServer, "Entity");
|
||||
if (m_serversNum != serverCount) {
|
||||
m_serversNum = serverCount;
|
||||
emit serversNumChanged(m_serversNum);
|
||||
}
|
||||
showOctreeServersOfType(NodeType::EntityServer);
|
||||
}
|
||||
|
||||
void OctreeStatsProvider::showOctreeServersOfType(int& serverCount, NodeType_t serverType, const char* serverTypeName) {
|
||||
|
||||
void OctreeStatsProvider::showOctreeServersOfType(NodeType_t serverType) {
|
||||
m_servers.clear();
|
||||
|
||||
auto nodeList = DependencyManager::get<NodeList>();
|
||||
nodeList->eachNode([&](const SharedNodePointer& node) {
|
||||
|
||||
// only send to the NodeTypes that are NodeType_t_VOXEL_SERVER
|
||||
if (node->getType() == serverType) {
|
||||
serverCount++;
|
||||
|
||||
QString lesserDetails;
|
||||
QString moreDetails;
|
||||
QString mostDetails;
|
||||
|
||||
if (node->getActiveSocket()) {
|
||||
lesserDetails += "active ";
|
||||
} else {
|
||||
lesserDetails += "inactive ";
|
||||
}
|
||||
|
||||
QUuid nodeUUID = node->getUUID();
|
||||
auto node = DependencyManager::get<NodeList>()->soloNodeOfType(serverType);
|
||||
if (node) {
|
||||
QString lesserDetails;
|
||||
QString moreDetails;
|
||||
QString mostDetails;
|
||||
|
||||
// now lookup stats details for this server...
|
||||
NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats();
|
||||
sceneStats->withReadLock([&] {
|
||||
if (sceneStats->find(nodeUUID) != sceneStats->end()) {
|
||||
OctreeSceneStats& stats = sceneStats->at(nodeUUID);
|
||||
if (node->getActiveSocket()) {
|
||||
lesserDetails += "active ";
|
||||
} else {
|
||||
lesserDetails += "inactive ";
|
||||
}
|
||||
|
||||
float lastFullEncode = stats.getLastFullTotalEncodeTime() / USECS_PER_MSEC;
|
||||
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;
|
||||
}
|
||||
QUuid nodeUUID = node->getUUID();
|
||||
|
||||
mostDetails += QString("<br/><br/>Last Full Scene... Encode: %1 ms Send: %2 ms Packets: %3 Bytes: %4 Rate: %5 PPS")
|
||||
.arg(lastFullEncode)
|
||||
.arg(lastFullSend)
|
||||
.arg(lastFullPackets)
|
||||
.arg(stats.getLastFullTotalBytes())
|
||||
.arg(lastFullPPS);
|
||||
// now lookup stats details for this server...
|
||||
NodeToOctreeSceneStats* sceneStats = qApp->getOcteeSceneStats();
|
||||
sceneStats->withReadLock([&] {
|
||||
if (sceneStats->find(nodeUUID) != sceneStats->end()) {
|
||||
OctreeSceneStats& stats = sceneStats->at(nodeUUID);
|
||||
|
||||
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());
|
||||
float lastFullEncode = stats.getLastFullTotalEncodeTime() / USECS_PER_MSEC;
|
||||
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;
|
||||
}
|
||||
});
|
||||
m_servers.append(lesserDetails);
|
||||
m_servers.append(moreDetails);
|
||||
m_servers.append(mostDetails);
|
||||
} // is VOXEL_SERVER
|
||||
});
|
||||
|
||||
mostDetails += QString("<br/><br/>Last Full Scene... Encode: %1 ms Send: %2 ms Packets: %3 Bytes: %4 Rate: %5 PPS")
|
||||
.arg(lastFullEncode)
|
||||
.arg(lastFullSend)
|
||||
.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);
|
||||
}
|
||||
|
||||
|
|
|
@ -18,15 +18,10 @@
|
|||
|
||||
#include "DependencyManager.h"
|
||||
|
||||
#define MAX_STATS 100
|
||||
#define MAX_VOXEL_SERVERS 50
|
||||
#define DEFAULT_COLOR 0
|
||||
|
||||
class OctreeStatsProvider : public QObject, public Dependency {
|
||||
Q_OBJECT
|
||||
SINGLETON_DEPENDENCY
|
||||
|
||||
Q_PROPERTY(int serversNum READ serversNum NOTIFY serversNumChanged)
|
||||
Q_PROPERTY(QString serverElements READ serverElements NOTIFY serverElementsChanged)
|
||||
Q_PROPERTY(QString localElements READ localElements NOTIFY localElementsChanged)
|
||||
Q_PROPERTY(QString localElementsMemory READ localElementsMemory NOTIFY localElementsMemoryChanged)
|
||||
|
@ -45,8 +40,6 @@ public:
|
|||
OctreeStatsProvider(QObject* parent, NodeToOctreeSceneStats* model);
|
||||
~OctreeStatsProvider();
|
||||
|
||||
int serversNum() const;
|
||||
|
||||
QString serverElements() const {
|
||||
return m_serverElements;
|
||||
}
|
||||
|
@ -96,8 +89,6 @@ public:
|
|||
}
|
||||
|
||||
signals:
|
||||
|
||||
void serversNumChanged(int serversNum);
|
||||
void serverElementsChanged(const QString &serverElements);
|
||||
void localElementsChanged(const QString &localElements);
|
||||
void sendingModeChanged(const QString &sendingMode);
|
||||
|
@ -121,7 +112,7 @@ private slots:
|
|||
void updateOctreeStatsData();
|
||||
protected:
|
||||
void updateOctreeServers();
|
||||
void showOctreeServersOfType(int& serverNumber, NodeType_t serverType, const char* serverTypeName);
|
||||
void showOctreeServersOfType(NodeType_t serverType);
|
||||
|
||||
private:
|
||||
NodeToOctreeSceneStats* _model;
|
||||
|
@ -135,7 +126,7 @@ private:
|
|||
quint64 _lastRefresh = 0;
|
||||
|
||||
QTimer _updateTimer;
|
||||
int m_serversNum {0};
|
||||
|
||||
QString m_serverElements;
|
||||
QString m_localElements;
|
||||
QString m_localElementsMemory;
|
||||
|
|
Loading…
Reference in a new issue