mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
improved client side stats, don't suppress initial stats message in server since it includes jurisdiction
This commit is contained in:
parent
e389c5daa1
commit
17e979dc9f
6 changed files with 68 additions and 38 deletions
|
@ -40,20 +40,11 @@ VoxelStatsDialog::VoxelStatsDialog(QWidget* parent, NodeToVoxelSceneStats* model
|
||||||
this->QDialog::setLayout(_form);
|
this->QDialog::setLayout(_form);
|
||||||
|
|
||||||
// Setup stat items
|
// Setup stat items
|
||||||
_serverVoxels = AddStatItem("Voxels on Servers", GREENISH);
|
_serverVoxels = AddStatItem("Voxels on Servers");
|
||||||
_localVoxels = AddStatItem("Local Voxels", YELLOWISH);
|
_localVoxels = AddStatItem("Local Voxels");
|
||||||
_localVoxelsMemory = AddStatItem("Voxels Memory", GREYISH);
|
_localVoxelsMemory = AddStatItem("Voxels Memory");
|
||||||
_voxelsRendered = AddStatItem("Voxels Rendered", GREENISH);
|
_voxelsRendered = AddStatItem("Voxels Rendered");
|
||||||
_sendingMode = AddStatItem("Sending Mode", YELLOWISH);
|
_sendingMode = AddStatItem("Sending Mode");
|
||||||
|
|
||||||
/** NOT YET READY
|
|
||||||
VoxelSceneStats temp;
|
|
||||||
for (int i = 0; i < VoxelSceneStats::ITEM_COUNT; i++) {
|
|
||||||
VoxelSceneStats::Item item = (VoxelSceneStats::Item)(i);
|
|
||||||
VoxelSceneStats::ItemInfo& itemInfo = temp.getItemInfo(item);
|
|
||||||
AddStatItem(itemInfo.caption, itemInfo.colorRGBA);
|
|
||||||
}
|
|
||||||
**/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void VoxelStatsDialog::RemoveStatItem(int item) {
|
void VoxelStatsDialog::RemoveStatItem(int item) {
|
||||||
|
@ -71,6 +62,11 @@ int VoxelStatsDialog::AddStatItem(const char* caption, unsigned colorRGBA) {
|
||||||
const int STATS_LABEL_WIDTH = 900;
|
const int STATS_LABEL_WIDTH = 900;
|
||||||
|
|
||||||
_statCount++; // increment our current stat count
|
_statCount++; // increment our current stat count
|
||||||
|
|
||||||
|
if (colorRGBA == 0) {
|
||||||
|
static unsigned rotatingColors[] = { GREENISH, YELLOWISH, GREYISH };
|
||||||
|
colorRGBA = rotatingColors[_statCount % (sizeof(rotatingColors)/sizeof(rotatingColors[0]))];
|
||||||
|
}
|
||||||
|
|
||||||
QLabel* label = _labels[_statCount] = new QLabel();
|
QLabel* label = _labels[_statCount] = new QLabel();
|
||||||
|
|
||||||
|
@ -222,7 +218,7 @@ void VoxelStatsDialog::showAllVoxelServers() {
|
||||||
if (serverCount > _voxelServerLabelsCount) {
|
if (serverCount > _voxelServerLabelsCount) {
|
||||||
char label[128] = { 0 };
|
char label[128] = { 0 };
|
||||||
sprintf(label, "Voxel Server %d",serverCount);
|
sprintf(label, "Voxel Server %d",serverCount);
|
||||||
_voxelServerLables[serverCount-1] = AddStatItem(label, GREENISH);
|
_voxelServerLables[serverCount-1] = AddStatItem(label);
|
||||||
_voxelServerLabelsCount++;
|
_voxelServerLabelsCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,10 +273,30 @@ void VoxelStatsDialog::showAllVoxelServers() {
|
||||||
QString internalString = locale.toString((uint)stats.getTotalInternal());
|
QString internalString = locale.toString((uint)stats.getTotalInternal());
|
||||||
QString leavesString = locale.toString((uint)stats.getTotalLeaves());
|
QString leavesString = locale.toString((uint)stats.getTotalLeaves());
|
||||||
|
|
||||||
serverDetails << "\n" << "Nodes:" <<
|
serverDetails << "\n" << "Voxels: " <<
|
||||||
totalString.toLocal8Bit().constData() << " total " <<
|
totalString.toLocal8Bit().constData() << " total " <<
|
||||||
internalString.toLocal8Bit().constData() << " internal " <<
|
internalString.toLocal8Bit().constData() << " internal " <<
|
||||||
leavesString.toLocal8Bit().constData() << " leaves ";
|
leavesString.toLocal8Bit().constData() << " leaves ";
|
||||||
|
|
||||||
|
const unsigned long USECS_PER_MSEC = 1000;
|
||||||
|
float lastFullEncode = stats.getLastFullTotalEncodeTime() / USECS_PER_MSEC;
|
||||||
|
float lastFullSend = stats.getLastFullElapsedTime() / USECS_PER_MSEC;
|
||||||
|
|
||||||
|
QString lastFullEncodeString = locale.toString(lastFullEncode);
|
||||||
|
QString lastFullSendString = locale.toString(lastFullSend);
|
||||||
|
|
||||||
|
serverDetails << "\n" << "Last Full Scene... " <<
|
||||||
|
"Encode Time: " << lastFullEncodeString.toLocal8Bit().constData() << " ms " <<
|
||||||
|
"Send Time: " << lastFullSendString.toLocal8Bit().constData() << " ms ";
|
||||||
|
|
||||||
|
bool details = false; // for now, we'd like to add an expand/contract feature to each voxel server
|
||||||
|
if (details) {
|
||||||
|
for (int i = 0; i < VoxelSceneStats::ITEM_COUNT; i++) {
|
||||||
|
VoxelSceneStats::Item item = (VoxelSceneStats::Item)(i);
|
||||||
|
VoxelSceneStats::ItemInfo& itemInfo = stats.getItemInfo(item);
|
||||||
|
serverDetails << "\n" << itemInfo.caption << " " << stats.getItemValue(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Application::getInstance()->unlockVoxelSceneStats();
|
Application::getInstance()->unlockVoxelSceneStats();
|
||||||
|
|
||||||
|
|
|
@ -38,7 +38,7 @@ protected:
|
||||||
// Emits a 'closed' signal when this dialog is closed.
|
// Emits a 'closed' signal when this dialog is closed.
|
||||||
void closeEvent(QCloseEvent*);
|
void closeEvent(QCloseEvent*);
|
||||||
|
|
||||||
int AddStatItem(const char* caption, unsigned colorRGBA);
|
int AddStatItem(const char* caption, unsigned colorRGBA = 0);
|
||||||
void RemoveStatItem(int item);
|
void RemoveStatItem(int item);
|
||||||
void showAllVoxelServers();
|
void showAllVoxelServers();
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,7 @@ uint64_t endSceneSleepTime = 0;
|
||||||
VoxelSendThread::VoxelSendThread(const QUuid& nodeUUID, VoxelServer* myServer) :
|
VoxelSendThread::VoxelSendThread(const QUuid& nodeUUID, VoxelServer* myServer) :
|
||||||
_nodeUUID(nodeUUID),
|
_nodeUUID(nodeUUID),
|
||||||
_myServer(myServer),
|
_myServer(myServer),
|
||||||
_packetData(),
|
_packetData()
|
||||||
_encodedSomething(false)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,21 +311,19 @@ int VoxelSendThread::deepestLevelVoxelDistributor(Node* node, VoxelNodeData* nod
|
||||||
uint64_t now = usecTimestampNow();
|
uint64_t now = usecTimestampNow();
|
||||||
nodeData->setLastTimeBagEmpty(now);
|
nodeData->setLastTimeBagEmpty(now);
|
||||||
}
|
}
|
||||||
if (_encodedSomething) {
|
|
||||||
nodeData->stats.sceneCompleted();
|
|
||||||
|
|
||||||
::endSceneSleepTime = _usleepTime;
|
|
||||||
unsigned long sleepTime = ::endSceneSleepTime - ::startSceneSleepTime;
|
|
||||||
|
|
||||||
unsigned long encodeTime = nodeData->stats.getTotalEncodeTime();
|
|
||||||
unsigned long elapsedTime = nodeData->stats.getElapsedTime();
|
|
||||||
packetsSentThisInterval += handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent);
|
|
||||||
|
|
||||||
if (_myServer->wantsDebugVoxelSending()) {
|
// track completed scenes and send out the stats packet accordingly
|
||||||
qDebug("Scene completed at %llu encodeTime:%lu sleepTime:%lu elapsed:%lu Packets:%llu Bytes:%llu Wasted:%llu\n",
|
nodeData->stats.sceneCompleted();
|
||||||
usecTimestampNow(), encodeTime, sleepTime, elapsedTime, _totalPackets, _totalBytes, _totalWastedBytes);
|
::endSceneSleepTime = _usleepTime;
|
||||||
}
|
unsigned long sleepTime = ::endSceneSleepTime - ::startSceneSleepTime;
|
||||||
|
|
||||||
|
unsigned long encodeTime = nodeData->stats.getTotalEncodeTime();
|
||||||
|
unsigned long elapsedTime = nodeData->stats.getElapsedTime();
|
||||||
|
packetsSentThisInterval += handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent);
|
||||||
|
|
||||||
|
if (true || _myServer->wantsDebugVoxelSending()) {
|
||||||
|
qDebug("Scene completed at %llu encodeTime:%lu sleepTime:%lu elapsed:%lu Packets:%llu Bytes:%llu Wasted:%llu\n",
|
||||||
|
usecTimestampNow(), encodeTime, sleepTime, elapsedTime, _totalPackets, _totalBytes, _totalWastedBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_myServer->wantDisplayVoxelStats()) {
|
if (_myServer->wantDisplayVoxelStats()) {
|
||||||
|
@ -431,9 +428,6 @@ int VoxelSendThread::deepestLevelVoxelDistributor(Node* node, VoxelNodeData* nod
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bytesWritten > 0) {
|
|
||||||
_encodedSomething = true;
|
|
||||||
}
|
|
||||||
nodeData->stats.encodeStopped();
|
nodeData->stats.encodeStopped();
|
||||||
_myServer->getServerTree().unlock();
|
_myServer->getServerTree().unlock();
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -43,8 +43,6 @@ private:
|
||||||
|
|
||||||
unsigned char _tempOutputBuffer[MAX_VOXEL_PACKET_SIZE]; // used by environment sending code
|
unsigned char _tempOutputBuffer[MAX_VOXEL_PACKET_SIZE]; // used by environment sending code
|
||||||
VoxelPacketData _packetData;
|
VoxelPacketData _packetData;
|
||||||
bool _encodedSomething;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // __voxel_server__VoxelSendThread__
|
#endif // __voxel_server__VoxelSendThread__
|
||||||
|
|
|
@ -26,6 +26,8 @@ VoxelSceneStats::VoxelSceneStats() :
|
||||||
reset();
|
reset();
|
||||||
_isReadyToSend = false;
|
_isReadyToSend = false;
|
||||||
_isStarted = false;
|
_isStarted = false;
|
||||||
|
_lastFullTotalEncodeTime = 0;
|
||||||
|
_lastFullElapsed = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy constructor
|
// copy constructor
|
||||||
|
@ -42,6 +44,9 @@ VoxelSceneStats& VoxelSceneStats::operator=(const VoxelSceneStats& other) {
|
||||||
|
|
||||||
void VoxelSceneStats::copyFromOther(const VoxelSceneStats& other) {
|
void VoxelSceneStats::copyFromOther(const VoxelSceneStats& other) {
|
||||||
_totalEncodeTime = other._totalEncodeTime;
|
_totalEncodeTime = other._totalEncodeTime;
|
||||||
|
_elapsed = other._elapsed;
|
||||||
|
_lastFullTotalEncodeTime = other._lastFullTotalEncodeTime;
|
||||||
|
_lastFullElapsed = other._lastFullElapsed;
|
||||||
_encodeStart = other._encodeStart;
|
_encodeStart = other._encodeStart;
|
||||||
|
|
||||||
_packets = other._packets;
|
_packets = other._packets;
|
||||||
|
@ -174,6 +179,11 @@ void VoxelSceneStats::sceneCompleted() {
|
||||||
_end = usecTimestampNow();
|
_end = usecTimestampNow();
|
||||||
_elapsed = _end - _start;
|
_elapsed = _end - _start;
|
||||||
_elapsedAverage.updateAverage((float)_elapsed);
|
_elapsedAverage.updateAverage((float)_elapsed);
|
||||||
|
|
||||||
|
if (_isFullScene) {
|
||||||
|
_lastFullElapsed = _elapsed;
|
||||||
|
_lastFullTotalEncodeTime = _totalEncodeTime;
|
||||||
|
}
|
||||||
|
|
||||||
_statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage));
|
_statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage));
|
||||||
_isReadyToSend = true;
|
_isReadyToSend = true;
|
||||||
|
@ -465,8 +475,15 @@ int VoxelSceneStats::unpackFromMessage(unsigned char* sourceBuffer, int availabl
|
||||||
sourceBuffer += sizeof(_elapsed);
|
sourceBuffer += sizeof(_elapsed);
|
||||||
memcpy(&_totalEncodeTime, sourceBuffer, sizeof(_totalEncodeTime));
|
memcpy(&_totalEncodeTime, sourceBuffer, sizeof(_totalEncodeTime));
|
||||||
sourceBuffer += sizeof(_totalEncodeTime);
|
sourceBuffer += sizeof(_totalEncodeTime);
|
||||||
|
|
||||||
memcpy(&_isFullScene, sourceBuffer, sizeof(_isFullScene));
|
memcpy(&_isFullScene, sourceBuffer, sizeof(_isFullScene));
|
||||||
sourceBuffer += sizeof(_isFullScene);
|
sourceBuffer += sizeof(_isFullScene);
|
||||||
|
|
||||||
|
if (_isFullScene) {
|
||||||
|
_lastFullElapsed = _elapsed;
|
||||||
|
_lastFullTotalEncodeTime = _totalEncodeTime;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(&_isMoving, sourceBuffer, sizeof(_isMoving));
|
memcpy(&_isMoving, sourceBuffer, sizeof(_isMoving));
|
||||||
sourceBuffer += sizeof(_isMoving);
|
sourceBuffer += sizeof(_isMoving);
|
||||||
memcpy(&_packets, sourceBuffer, sizeof(_packets));
|
memcpy(&_packets, sourceBuffer, sizeof(_packets));
|
||||||
|
|
|
@ -148,6 +148,9 @@ public:
|
||||||
unsigned long getTotalLeaves() const { return _totalLeaves; }
|
unsigned long getTotalLeaves() const { return _totalLeaves; }
|
||||||
unsigned long getTotalEncodeTime() const { return _totalEncodeTime; }
|
unsigned long getTotalEncodeTime() const { return _totalEncodeTime; }
|
||||||
unsigned long getElapsedTime() const { return _elapsed; }
|
unsigned long getElapsedTime() const { return _elapsed; }
|
||||||
|
|
||||||
|
unsigned long getLastFullTotalEncodeTime() const { return _lastFullTotalEncodeTime; }
|
||||||
|
unsigned long getLastFullElapsedTime() const { return _lastFullElapsed; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -162,11 +165,13 @@ private:
|
||||||
uint64_t _start;
|
uint64_t _start;
|
||||||
uint64_t _end;
|
uint64_t _end;
|
||||||
uint64_t _elapsed;
|
uint64_t _elapsed;
|
||||||
|
uint64_t _lastFullElapsed;
|
||||||
|
|
||||||
SimpleMovingAverage _elapsedAverage;
|
SimpleMovingAverage _elapsedAverage;
|
||||||
SimpleMovingAverage _bitsPerVoxelAverage;
|
SimpleMovingAverage _bitsPerVoxelAverage;
|
||||||
|
|
||||||
uint64_t _totalEncodeTime;
|
uint64_t _totalEncodeTime;
|
||||||
|
uint64_t _lastFullTotalEncodeTime;
|
||||||
uint64_t _encodeStart;
|
uint64_t _encodeStart;
|
||||||
|
|
||||||
// scene voxel related data
|
// scene voxel related data
|
||||||
|
|
Loading…
Reference in a new issue