From fcce4753c9f85d2a7e82a868d52bd7b16c704a6f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 2 May 2013 16:37:31 -0700 Subject: [PATCH] more optimizations on render pipeline --- interface/src/VoxelSystem.cpp | 33 +++++++++++++++++++++--------- interface/src/VoxelSystem.h | 2 ++ libraries/voxels/src/VoxelNode.cpp | 12 ++++++++--- 3 files changed, 34 insertions(+), 13 deletions(-) diff --git a/interface/src/VoxelSystem.cpp b/interface/src/VoxelSystem.cpp index 5ee098a775..2195c7fe1a 100644 --- a/interface/src/VoxelSystem.cpp +++ b/interface/src/VoxelSystem.cpp @@ -150,6 +150,7 @@ int VoxelSystem::parseData(unsigned char* sourceBuffer, int numBytes) { void VoxelSystem::setupNewVoxelsForDrawing() { double start = usecTimestampNow(); if (_tree->isDirty()) { + _callsToTreesToArrays++; _voxelsUpdated = newTreeToArrays(_tree->rootNode); _tree->clearDirtyBit(); // after we pull the trees into the array, we can consider the tree clean } else { @@ -163,14 +164,16 @@ void VoxelSystem::setupNewVoxelsForDrawing() { if (_renderWarningsOn && elapsedmsec > 1) { if (elapsedmsec > 1000) { double elapsedsec = (end - start)/1000000.0; - printLog("WARNING! newTreeToArrays() took %lf seconds\n",elapsedsec); + printLog("WARNING! newTreeToArrays() took %lf seconds %ld voxels updated\n", elapsedsec, _voxelsUpdated); } else { - printLog("WARNING! newTreeToArrays() took %lf milliseconds\n",elapsedmsec); + printLog("WARNING! newTreeToArrays() took %lf milliseconds %ld voxels updated\n", elapsedmsec, _voxelsUpdated); } } - // copy the newly written data to the arrays designated for reading - copyWrittenDataToReadArrays(); + if (_voxelsDirty) { + // copy the newly written data to the arrays designated for reading + copyWrittenDataToReadArrays(); + } } void VoxelSystem::copyWrittenDataToReadArrays() { @@ -189,9 +192,11 @@ void VoxelSystem::copyWrittenDataToReadArrays() { if (_renderWarningsOn && elapsedmsec > 1) { if (elapsedmsec > 1000) { double elapsedsec = (end - start)/1000000.0; - printLog("WARNING! copyWrittenDataToReadArrays() took %lf seconds\n",elapsedsec); + printLog("WARNING! copyWrittenDataToReadArrays() took %lf seconds for %ld voxels %ld updated\n", + elapsedsec, _voxelsInArrays, _voxelsUpdated); } else { - printLog("WARNING! copyWrittenDataToReadArrays() took %lf milliseconds\n",elapsedmsec); + printLog("WARNING! copyWrittenDataToReadArrays() took %lf milliseconds for %ld voxels %ld updated\n", + elapsedmsec, _voxelsInArrays, _voxelsUpdated); } } } @@ -266,6 +271,7 @@ VoxelSystem* VoxelSystem::clone() const { void VoxelSystem::init() { _renderWarningsOn = false; + _callsToTreesToArrays = 0; // When we change voxels representations in the arrays, we'll update this _voxelsDirty = false; @@ -373,13 +379,20 @@ void VoxelSystem::updateVBOs() { double end = usecTimestampNow(); double elapsedmsec = (end - start)/1000.0; if (_renderWarningsOn && elapsedmsec > 1) { - if (elapsedmsec > 1000) { - double elapsedsec = (end - start)/1000000.0; - printLog("WARNING! updateVBOs() took %lf seconds\n",elapsedsec); + if (elapsedmsec > 1) { + if (elapsedmsec > 1000) { + double elapsedsec = (end - start)/1000000.0; + printLog("WARNING! updateVBOs() took %lf seconds after %d calls to newTreeToArrays()\n", + elapsedsec, _callsToTreesToArrays); + } else { + printLog("WARNING! updateVBOs() took %lf milliseconds after %d calls to newTreeToArrays()\n", + elapsedmsec, _callsToTreesToArrays); + } } else { - printLog("WARNING! updateVBOs() took %lf milliseconds\n",elapsedmsec); + printLog("WARNING! updateVBOs() called after %d calls to newTreeToArrays()\n",_callsToTreesToArrays); } } + _callsToTreesToArrays = 0; // clear it } void VoxelSystem::render() { diff --git a/interface/src/VoxelSystem.h b/interface/src/VoxelSystem.h index d2c3fed499..949417cf3b 100644 --- a/interface/src/VoxelSystem.h +++ b/interface/src/VoxelSystem.h @@ -63,6 +63,8 @@ public: bool getRenderPipelineWarnings() const { return _renderWarningsOn; }; private: + int _callsToTreesToArrays; + bool _renderWarningsOn; // Operation functions for tree recursion methods static int _nodeCount; diff --git a/libraries/voxels/src/VoxelNode.cpp b/libraries/voxels/src/VoxelNode.cpp index 80da795fe1..7e411d9c4b 100644 --- a/libraries/voxels/src/VoxelNode.cpp +++ b/libraries/voxels/src/VoxelNode.cpp @@ -125,7 +125,9 @@ void VoxelNode::setFalseColor(colorPart red, colorPart green, colorPart blue) { _currentColor[1] = green; _currentColor[2] = blue; _currentColor[3] = 1; // XXXBHG - False colors are always considered set - _isDirty = true; + if (_shouldRender) { + _isDirty = true; + } } } @@ -136,7 +138,9 @@ void VoxelNode::setFalseColored(bool isFalseColored) { memcpy(&_currentColor,&_trueColor,sizeof(nodeColor)); } _falseColored = isFalseColored; - _isDirty = true; + if (_shouldRender) { + _isDirty = true; + } } }; @@ -149,7 +153,9 @@ void VoxelNode::setColor(const nodeColor& color) { if (!_falseColored) { memcpy(&_currentColor,&color,sizeof(nodeColor)); } - _isDirty = true; + if (_shouldRender) { + _isDirty = true; + } } } #endif