mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 21:36:47 +02:00
added total voxel count to stats
This commit is contained in:
parent
86ad0da09f
commit
de7cd4db03
6 changed files with 86 additions and 20 deletions
|
@ -44,6 +44,8 @@ void VoxelNode::init(unsigned char * octalCode) {
|
||||||
_children[i] = NULL;
|
_children[i] = NULL;
|
||||||
}
|
}
|
||||||
_childCount = 0;
|
_childCount = 0;
|
||||||
|
_subtreeNodeCount = 1; // that's me
|
||||||
|
_subtreeLeafNodeCount = 0; // that's me
|
||||||
|
|
||||||
_glBufferIndex = GLBUFFER_INDEX_UNKNOWN;
|
_glBufferIndex = GLBUFFER_INDEX_UNKNOWN;
|
||||||
_isDirty = true;
|
_isDirty = true;
|
||||||
|
@ -79,6 +81,24 @@ void VoxelNode::handleSubtreeChanged(VoxelTree* myTree) {
|
||||||
if (myTree->getShouldReaverage()) {
|
if (myTree->getShouldReaverage()) {
|
||||||
setColorFromAverageOfChildren();
|
setColorFromAverageOfChildren();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
recalculateSubTreeNodeCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
void VoxelNode::recalculateSubTreeNodeCount() {
|
||||||
|
// Assuming the tree below me as changed, I need to recalculate my node count
|
||||||
|
_subtreeNodeCount = 1; // that's me
|
||||||
|
if (isLeaf()) {
|
||||||
|
_subtreeLeafNodeCount = 1;
|
||||||
|
} else {
|
||||||
|
_subtreeLeafNodeCount = 0;
|
||||||
|
for (int i = 0; i < NUMBER_OF_CHILDREN; i++) {
|
||||||
|
if (_children[i]) {
|
||||||
|
_subtreeNodeCount += _children[i]->_subtreeNodeCount;
|
||||||
|
_subtreeLeafNodeCount += _children[i]->_subtreeLeafNodeCount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,12 @@ public:
|
||||||
|
|
||||||
static int addDeleteHook(VoxelNodeDeleteHook hook, void* extraData = NULL);
|
static int addDeleteHook(VoxelNodeDeleteHook hook, void* extraData = NULL);
|
||||||
static void removeDeleteHook(int hookID);
|
static void removeDeleteHook(int hookID);
|
||||||
|
|
||||||
|
void recalculateSubTreeNodeCount();
|
||||||
|
unsigned long getSubTreeNodeCount() const { return _subtreeNodeCount; };
|
||||||
|
unsigned long getSubTreeInternalNodeCount() const { return _subtreeNodeCount - _subtreeLeafNodeCount; };
|
||||||
|
unsigned long getSubTreeLeafNodeCount() const { return _subtreeLeafNodeCount; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void calculateAABox();
|
void calculateAABox();
|
||||||
void init(unsigned char * octalCode);
|
void init(unsigned char * octalCode);
|
||||||
|
@ -126,6 +132,8 @@ private:
|
||||||
unsigned char* _octalCode;
|
unsigned char* _octalCode;
|
||||||
VoxelNode* _children[8];
|
VoxelNode* _children[8];
|
||||||
int _childCount;
|
int _childCount;
|
||||||
|
unsigned long _subtreeNodeCount;
|
||||||
|
unsigned long _subtreeLeafNodeCount;
|
||||||
float _density; // If leaf: density = 1, if internal node: 0-1 density of voxels inside
|
float _density; // If leaf: density = 1, if internal node: 0-1 density of voxels inside
|
||||||
|
|
||||||
static VoxelNodeDeleteHook _hooks[VOXEL_NODE_MAX_DELETE_HOOKS];
|
static VoxelNodeDeleteHook _hooks[VOXEL_NODE_MAX_DELETE_HOOKS];
|
||||||
|
|
|
@ -21,9 +21,13 @@ VoxelSceneStats::VoxelSceneStats() {
|
||||||
VoxelSceneStats::~VoxelSceneStats() {
|
VoxelSceneStats::~VoxelSceneStats() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void VoxelSceneStats::sceneStarted(bool fullScene, bool moving) {
|
void VoxelSceneStats::sceneStarted(bool fullScene, bool moving, VoxelNode* root) {
|
||||||
_start = usecTimestampNow();
|
|
||||||
reset(); // resets packet and voxel stats
|
reset(); // resets packet and voxel stats
|
||||||
|
_start = usecTimestampNow();
|
||||||
|
_totalVoxels = root->getSubTreeNodeCount();
|
||||||
|
_totalInternal = root->getSubTreeInternalNodeCount();
|
||||||
|
_totalLeaves = root->getSubTreeLeafNodeCount();
|
||||||
|
|
||||||
_fullSceneDraw = fullScene;
|
_fullSceneDraw = fullScene;
|
||||||
_moving = moving;
|
_moving = moving;
|
||||||
}
|
}
|
||||||
|
@ -53,6 +57,10 @@ void VoxelSceneStats::reset() {
|
||||||
_bytes = 0;
|
_bytes = 0;
|
||||||
_passes = 0;
|
_passes = 0;
|
||||||
|
|
||||||
|
_totalVoxels = 0;
|
||||||
|
_totalInternal = 0;
|
||||||
|
_totalLeaves = 0;
|
||||||
|
|
||||||
_traversed = 0;
|
_traversed = 0;
|
||||||
_internal = 0;
|
_internal = 0;
|
||||||
_leaves = 0;
|
_leaves = 0;
|
||||||
|
@ -214,6 +222,10 @@ int VoxelSceneStats::packIntoMessage(unsigned char* destinationBuffer, int avail
|
||||||
memcpy(destinationBuffer, &_bytes, sizeof(_bytes));
|
memcpy(destinationBuffer, &_bytes, sizeof(_bytes));
|
||||||
destinationBuffer += sizeof(_bytes);
|
destinationBuffer += sizeof(_bytes);
|
||||||
|
|
||||||
|
memcpy(destinationBuffer, &_totalInternal, sizeof(_totalInternal));
|
||||||
|
destinationBuffer += sizeof(_totalInternal);
|
||||||
|
memcpy(destinationBuffer, &_totalLeaves, sizeof(_totalLeaves));
|
||||||
|
destinationBuffer += sizeof(_totalLeaves);
|
||||||
memcpy(destinationBuffer, &_internal, sizeof(_internal));
|
memcpy(destinationBuffer, &_internal, sizeof(_internal));
|
||||||
destinationBuffer += sizeof(_internal);
|
destinationBuffer += sizeof(_internal);
|
||||||
memcpy(destinationBuffer, &_leaves, sizeof(_leaves));
|
memcpy(destinationBuffer, &_leaves, sizeof(_leaves));
|
||||||
|
@ -281,12 +293,19 @@ int VoxelSceneStats::unpackFromMessage(unsigned char* sourceBuffer, int availabl
|
||||||
sourceBuffer += sizeof(_packets);
|
sourceBuffer += sizeof(_packets);
|
||||||
memcpy(&_bytes, sourceBuffer, sizeof(_bytes));
|
memcpy(&_bytes, sourceBuffer, sizeof(_bytes));
|
||||||
sourceBuffer += sizeof(_bytes);
|
sourceBuffer += sizeof(_bytes);
|
||||||
|
|
||||||
|
memcpy(&_totalInternal, sourceBuffer, sizeof(_totalInternal));
|
||||||
|
sourceBuffer += sizeof(_totalInternal);
|
||||||
|
memcpy(&_totalLeaves, sourceBuffer, sizeof(_totalLeaves));
|
||||||
|
sourceBuffer += sizeof(_totalLeaves);
|
||||||
|
_totalVoxels = _totalInternal + _totalLeaves;
|
||||||
|
|
||||||
memcpy(&_internal, sourceBuffer, sizeof(_internal));
|
memcpy(&_internal, sourceBuffer, sizeof(_internal));
|
||||||
sourceBuffer += sizeof(_internal);
|
sourceBuffer += sizeof(_internal);
|
||||||
memcpy(&_leaves, sourceBuffer, sizeof(_leaves));
|
memcpy(&_leaves, sourceBuffer, sizeof(_leaves));
|
||||||
sourceBuffer += sizeof(_leaves);
|
sourceBuffer += sizeof(_leaves);
|
||||||
_traversed = _internal + _leaves;
|
_traversed = _internal + _leaves;
|
||||||
|
|
||||||
memcpy(&_internalSkippedDistance, sourceBuffer, sizeof(_internalSkippedDistance));
|
memcpy(&_internalSkippedDistance, sourceBuffer, sizeof(_internalSkippedDistance));
|
||||||
sourceBuffer += sizeof(_internalSkippedDistance);
|
sourceBuffer += sizeof(_internalSkippedDistance);
|
||||||
memcpy(&_leavesSkippedDistance, sourceBuffer, sizeof(_leavesSkippedDistance));
|
memcpy(&_leavesSkippedDistance, sourceBuffer, sizeof(_leavesSkippedDistance));
|
||||||
|
@ -356,6 +375,9 @@ void VoxelSceneStats::printDebugDetails() {
|
||||||
qDebug(" packets: %d\n", _packets);
|
qDebug(" packets: %d\n", _packets);
|
||||||
qDebug(" bytes : %ld\n", _bytes);
|
qDebug(" bytes : %ld\n", _bytes);
|
||||||
qDebug("\n");
|
qDebug("\n");
|
||||||
|
qDebug(" total voxels : %lu\n", _totalVoxels );
|
||||||
|
qDebug(" internal : %lu\n", _totalInternal );
|
||||||
|
qDebug(" leaves : %lu\n", _totalLeaves );
|
||||||
qDebug(" traversed : %lu\n", _traversed );
|
qDebug(" traversed : %lu\n", _traversed );
|
||||||
qDebug(" internal : %lu\n", _internal );
|
qDebug(" internal : %lu\n", _internal );
|
||||||
qDebug(" leaves : %lu\n", _leaves );
|
qDebug(" leaves : %lu\n", _leaves );
|
||||||
|
@ -393,18 +415,19 @@ VoxelSceneStats::ItemInfo VoxelSceneStats::_ITEMS[] = {
|
||||||
{ "Elapsed" , 0x40ff40d0 },
|
{ "Elapsed" , 0x40ff40d0 },
|
||||||
{ "Encode" , 0xffef40c0 },
|
{ "Encode" , 0xffef40c0 },
|
||||||
{ "Network" , 0xd0d0d0a0 },
|
{ "Network" , 0xd0d0d0a0 },
|
||||||
{ "Voxels Sent" , 0x40ff40d0 },
|
{ "Voxels on Server" , 0x40ff40d0 },
|
||||||
{ "Colors Sent" , 0xffef40c0 },
|
{ "Voxels Sent" , 0xffef40c0 },
|
||||||
{ "Bitmasks Sent" , 0xd0d0d0a0 },
|
{ "Colors Sent" , 0xd0d0d0a0 },
|
||||||
{ "Traversed" , 0x40ff40d0 },
|
{ "Bitmasks Sent" , 0x40ff40d0 },
|
||||||
{ "Skipped - Total" , 0xffef40c0 },
|
{ "Traversed" , 0xffef40c0 },
|
||||||
{ "Skipped - Distance" , 0xd0d0d0a0 },
|
{ "Skipped - Total" , 0xd0d0d0a0 },
|
||||||
{ "Skipped - Out of View", 0x40ff40d0 },
|
{ "Skipped - Distance" , 0x40ff40d0 },
|
||||||
{ "Skipped - Was in View", 0xffef40c0 },
|
{ "Skipped - Out of View", 0xffef40c0 },
|
||||||
{ "Skipped - No Change" , 0xd0d0d0a0 },
|
{ "Skipped - Was in View", 0xd0d0d0a0 },
|
||||||
{ "Skipped - Occluded" , 0x40ff40d0 },
|
{ "Skipped - No Change" , 0x40ff40d0 },
|
||||||
{ "Didn't fit in packet" , 0xffef40c0 },
|
{ "Skipped - Occluded" , 0xffef40c0 },
|
||||||
{ "Mode" , 0xd0d0d0a0 },
|
{ "Didn't fit in packet" , 0xd0d0d0a0 },
|
||||||
|
{ "Mode" , 0x40ff40d0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
char* VoxelSceneStats::getItemValue(int item) {
|
char* VoxelSceneStats::getItemValue(int item) {
|
||||||
|
@ -426,10 +449,15 @@ char* VoxelSceneStats::getItemValue(int item) {
|
||||||
sprintf(_itemValueBuffer, "%d packets %lu bytes (%d kbps)", _packets, _bytes, calculatedKBPS);
|
sprintf(_itemValueBuffer, "%d packets %lu bytes (%d kbps)", _packets, _bytes, calculatedKBPS);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ITEM_VOXELS_SERVER: {
|
||||||
|
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||||
|
_totalVoxels, _totalInternal, _totalLeaves);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case ITEM_VOXELS: {
|
case ITEM_VOXELS: {
|
||||||
unsigned long total = _existsInPacketBitsWritten + _colorSent;
|
unsigned long total = _existsInPacketBitsWritten + _colorSent;
|
||||||
float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total;
|
float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total;
|
||||||
sprintf(_itemValueBuffer, "%lu total (%.2f bits/voxel) %lu internal %lu leaves",
|
sprintf(_itemValueBuffer, "%lu (%.2f bits/voxel) %lu internal %lu leaves",
|
||||||
total, calculatedBPV, _existsInPacketBitsWritten, _colorSent);
|
total, calculatedBPV, _existsInPacketBitsWritten, _colorSent);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ public:
|
||||||
VoxelSceneStats();
|
VoxelSceneStats();
|
||||||
~VoxelSceneStats();
|
~VoxelSceneStats();
|
||||||
void reset();
|
void reset();
|
||||||
void sceneStarted(bool fullScene, bool moving);
|
void sceneStarted(bool fullScene, bool moving, VoxelNode* root);
|
||||||
void sceneCompleted();
|
void sceneCompleted();
|
||||||
|
|
||||||
void printDebugDetails();
|
void printDebugDetails();
|
||||||
|
@ -53,6 +53,7 @@ public:
|
||||||
ITEM_ELAPSED,
|
ITEM_ELAPSED,
|
||||||
ITEM_ENCODE,
|
ITEM_ENCODE,
|
||||||
ITEM_PACKETS,
|
ITEM_PACKETS,
|
||||||
|
ITEM_VOXELS_SERVER,
|
||||||
ITEM_VOXELS,
|
ITEM_VOXELS,
|
||||||
ITEM_COLORS,
|
ITEM_COLORS,
|
||||||
ITEM_BITS,
|
ITEM_BITS,
|
||||||
|
@ -91,6 +92,10 @@ private:
|
||||||
uint64_t _encodeStart;
|
uint64_t _encodeStart;
|
||||||
|
|
||||||
// scene voxel related data
|
// scene voxel related data
|
||||||
|
unsigned long _totalVoxels;
|
||||||
|
unsigned long _totalInternal;
|
||||||
|
unsigned long _totalLeaves;
|
||||||
|
|
||||||
unsigned long _traversed;
|
unsigned long _traversed;
|
||||||
unsigned long _internal;
|
unsigned long _internal;
|
||||||
unsigned long _leaves;
|
unsigned long _leaves;
|
||||||
|
|
|
@ -673,6 +673,9 @@ void VoxelTree::reaverageVoxelColors(VoxelNode *startNode) {
|
||||||
if (hasChildren && !startNode->collapseIdenticalLeaves()) {
|
if (hasChildren && !startNode->collapseIdenticalLeaves()) {
|
||||||
startNode->setColorFromAverageOfChildren();
|
startNode->setColorFromAverageOfChildren();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this is also a good time to recalculateSubTreeNodeCount()
|
||||||
|
startNode->recalculateSubTreeNodeCount();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -250,7 +250,7 @@ void deepestLevelVoxelDistributor(NodeList* nodeList,
|
||||||
|
|
||||||
// start tracking our stats
|
// start tracking our stats
|
||||||
bool fullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging();
|
bool fullScene = (!viewFrustumChanged || !nodeData->getWantDelta()) && nodeData->getViewFrustumJustStoppedChanging();
|
||||||
nodeData->stats.sceneStarted(fullScene, viewFrustumChanged);
|
nodeData->stats.sceneStarted(fullScene, viewFrustumChanged, ::serverTree.rootNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we have something in our nodeBag, then turn them into packets and send them out...
|
// If we have something in our nodeBag, then turn them into packets and send them out...
|
||||||
|
@ -486,8 +486,10 @@ int main(int argc, const char * argv[]) {
|
||||||
|
|
||||||
::serverTree.clearDirtyBit(); // the tree is clean since we just loaded it
|
::serverTree.clearDirtyBit(); // the tree is clean since we just loaded it
|
||||||
printf("DONE loading voxels from file... fileRead=%s\n", debug::valueOf(persistantFileRead));
|
printf("DONE loading voxels from file... fileRead=%s\n", debug::valueOf(persistantFileRead));
|
||||||
unsigned long nodeCount = ::serverTree.getVoxelCount();
|
unsigned long nodeCount = ::serverTree.rootNode->getSubTreeNodeCount();
|
||||||
printf("Nodes after loading scene %ld nodes\n", nodeCount);
|
unsigned long internalNodeCount = ::serverTree.rootNode->getSubTreeInternalNodeCount();
|
||||||
|
unsigned long leafNodeCount = ::serverTree.rootNode->getSubTreeLeafNodeCount();
|
||||||
|
printf("Nodes after loading scene %lu nodes %lu internal %lu leaves\n", nodeCount, internalNodeCount, leafNodeCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if the user passed in a command line option for loading an old style local
|
// Check to see if the user passed in a command line option for loading an old style local
|
||||||
|
|
Loading…
Reference in a new issue