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);
|
||||
|
||||
// Setup stat items
|
||||
_serverVoxels = AddStatItem("Voxels on Servers", GREENISH);
|
||||
_localVoxels = AddStatItem("Local Voxels", YELLOWISH);
|
||||
_localVoxelsMemory = AddStatItem("Voxels Memory", GREYISH);
|
||||
_voxelsRendered = AddStatItem("Voxels Rendered", GREENISH);
|
||||
_sendingMode = AddStatItem("Sending Mode", YELLOWISH);
|
||||
|
||||
/** 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);
|
||||
}
|
||||
**/
|
||||
_serverVoxels = AddStatItem("Voxels on Servers");
|
||||
_localVoxels = AddStatItem("Local Voxels");
|
||||
_localVoxelsMemory = AddStatItem("Voxels Memory");
|
||||
_voxelsRendered = AddStatItem("Voxels Rendered");
|
||||
_sendingMode = AddStatItem("Sending Mode");
|
||||
}
|
||||
|
||||
void VoxelStatsDialog::RemoveStatItem(int item) {
|
||||
|
@ -71,6 +62,11 @@ int VoxelStatsDialog::AddStatItem(const char* caption, unsigned colorRGBA) {
|
|||
const int STATS_LABEL_WIDTH = 900;
|
||||
|
||||
_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();
|
||||
|
||||
|
@ -222,7 +218,7 @@ void VoxelStatsDialog::showAllVoxelServers() {
|
|||
if (serverCount > _voxelServerLabelsCount) {
|
||||
char label[128] = { 0 };
|
||||
sprintf(label, "Voxel Server %d",serverCount);
|
||||
_voxelServerLables[serverCount-1] = AddStatItem(label, GREENISH);
|
||||
_voxelServerLables[serverCount-1] = AddStatItem(label);
|
||||
_voxelServerLabelsCount++;
|
||||
}
|
||||
|
||||
|
@ -277,10 +273,30 @@ void VoxelStatsDialog::showAllVoxelServers() {
|
|||
QString internalString = locale.toString((uint)stats.getTotalInternal());
|
||||
QString leavesString = locale.toString((uint)stats.getTotalLeaves());
|
||||
|
||||
serverDetails << "\n" << "Nodes:" <<
|
||||
serverDetails << "\n" << "Voxels: " <<
|
||||
totalString.toLocal8Bit().constData() << " total " <<
|
||||
internalString.toLocal8Bit().constData() << " internal " <<
|
||||
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();
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ protected:
|
|||
// Emits a 'closed' signal when this dialog is closed.
|
||||
void closeEvent(QCloseEvent*);
|
||||
|
||||
int AddStatItem(const char* caption, unsigned colorRGBA);
|
||||
int AddStatItem(const char* caption, unsigned colorRGBA = 0);
|
||||
void RemoveStatItem(int item);
|
||||
void showAllVoxelServers();
|
||||
|
||||
|
|
|
@ -29,8 +29,7 @@ uint64_t endSceneSleepTime = 0;
|
|||
VoxelSendThread::VoxelSendThread(const QUuid& nodeUUID, VoxelServer* myServer) :
|
||||
_nodeUUID(nodeUUID),
|
||||
_myServer(myServer),
|
||||
_packetData(),
|
||||
_encodedSomething(false)
|
||||
_packetData()
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -312,21 +311,19 @@ int VoxelSendThread::deepestLevelVoxelDistributor(Node* node, VoxelNodeData* nod
|
|||
uint64_t now = usecTimestampNow();
|
||||
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()) {
|
||||
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);
|
||||
}
|
||||
|
||||
// track completed scenes and send out the stats packet accordingly
|
||||
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 (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()) {
|
||||
|
@ -431,9 +428,6 @@ int VoxelSendThread::deepestLevelVoxelDistributor(Node* node, VoxelNodeData* nod
|
|||
}
|
||||
}
|
||||
|
||||
if (bytesWritten > 0) {
|
||||
_encodedSomething = true;
|
||||
}
|
||||
nodeData->stats.encodeStopped();
|
||||
_myServer->getServerTree().unlock();
|
||||
} else {
|
||||
|
|
|
@ -43,8 +43,6 @@ private:
|
|||
|
||||
unsigned char _tempOutputBuffer[MAX_VOXEL_PACKET_SIZE]; // used by environment sending code
|
||||
VoxelPacketData _packetData;
|
||||
bool _encodedSomething;
|
||||
|
||||
};
|
||||
|
||||
#endif // __voxel_server__VoxelSendThread__
|
||||
|
|
|
@ -26,6 +26,8 @@ VoxelSceneStats::VoxelSceneStats() :
|
|||
reset();
|
||||
_isReadyToSend = false;
|
||||
_isStarted = false;
|
||||
_lastFullTotalEncodeTime = 0;
|
||||
_lastFullElapsed = 0;
|
||||
}
|
||||
|
||||
// copy constructor
|
||||
|
@ -42,6 +44,9 @@ VoxelSceneStats& VoxelSceneStats::operator=(const VoxelSceneStats& other) {
|
|||
|
||||
void VoxelSceneStats::copyFromOther(const VoxelSceneStats& other) {
|
||||
_totalEncodeTime = other._totalEncodeTime;
|
||||
_elapsed = other._elapsed;
|
||||
_lastFullTotalEncodeTime = other._lastFullTotalEncodeTime;
|
||||
_lastFullElapsed = other._lastFullElapsed;
|
||||
_encodeStart = other._encodeStart;
|
||||
|
||||
_packets = other._packets;
|
||||
|
@ -174,6 +179,11 @@ void VoxelSceneStats::sceneCompleted() {
|
|||
_end = usecTimestampNow();
|
||||
_elapsed = _end - _start;
|
||||
_elapsedAverage.updateAverage((float)_elapsed);
|
||||
|
||||
if (_isFullScene) {
|
||||
_lastFullElapsed = _elapsed;
|
||||
_lastFullTotalEncodeTime = _totalEncodeTime;
|
||||
}
|
||||
|
||||
_statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage));
|
||||
_isReadyToSend = true;
|
||||
|
@ -465,8 +475,15 @@ int VoxelSceneStats::unpackFromMessage(unsigned char* sourceBuffer, int availabl
|
|||
sourceBuffer += sizeof(_elapsed);
|
||||
memcpy(&_totalEncodeTime, sourceBuffer, sizeof(_totalEncodeTime));
|
||||
sourceBuffer += sizeof(_totalEncodeTime);
|
||||
|
||||
memcpy(&_isFullScene, sourceBuffer, sizeof(_isFullScene));
|
||||
sourceBuffer += sizeof(_isFullScene);
|
||||
|
||||
if (_isFullScene) {
|
||||
_lastFullElapsed = _elapsed;
|
||||
_lastFullTotalEncodeTime = _totalEncodeTime;
|
||||
}
|
||||
|
||||
memcpy(&_isMoving, sourceBuffer, sizeof(_isMoving));
|
||||
sourceBuffer += sizeof(_isMoving);
|
||||
memcpy(&_packets, sourceBuffer, sizeof(_packets));
|
||||
|
|
|
@ -148,6 +148,9 @@ public:
|
|||
unsigned long getTotalLeaves() const { return _totalLeaves; }
|
||||
unsigned long getTotalEncodeTime() const { return _totalEncodeTime; }
|
||||
unsigned long getElapsedTime() const { return _elapsed; }
|
||||
|
||||
unsigned long getLastFullTotalEncodeTime() const { return _lastFullTotalEncodeTime; }
|
||||
unsigned long getLastFullElapsedTime() const { return _lastFullElapsed; }
|
||||
|
||||
private:
|
||||
|
||||
|
@ -162,11 +165,13 @@ private:
|
|||
uint64_t _start;
|
||||
uint64_t _end;
|
||||
uint64_t _elapsed;
|
||||
uint64_t _lastFullElapsed;
|
||||
|
||||
SimpleMovingAverage _elapsedAverage;
|
||||
SimpleMovingAverage _bitsPerVoxelAverage;
|
||||
|
||||
uint64_t _totalEncodeTime;
|
||||
uint64_t _lastFullTotalEncodeTime;
|
||||
uint64_t _encodeStart;
|
||||
|
||||
// scene voxel related data
|
||||
|
|
Loading…
Reference in a new issue