From 2b62402a5722818f15b0b1950ccf7c7b2e195a92 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Nov 2014 13:17:46 -0800 Subject: [PATCH 1/5] possible fix for entities not always updating bug --- .../octree/OctreeInboundPacketProcessor.cpp | 4 ++ .../src/octree/OctreeQueryNode.cpp | 1 + .../src/octree/OctreeSendThread.cpp | 33 +++++++++++++- libraries/entities/src/EntityItem.cpp | 5 ++- libraries/entities/src/EntityItem.h | 7 ++- libraries/entities/src/EntityTree.cpp | 5 +++ libraries/entities/src/EntityTreeElement.cpp | 44 ++++++++++++++++++- libraries/octree/src/Octree.cpp | 15 +++++++ 8 files changed, 110 insertions(+), 4 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index b9bde8d544..f4e28d20e9 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -154,6 +154,9 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin quint64 startLock = usecTimestampNow(); _myServer->getOctree()->lockForWrite(); + + qDebug() << "{" << QThread::currentThread() << "} " << "TREE LOCKED FOR EDIT now:" << usecTimestampNow(); + quint64 startProcess = usecTimestampNow(); int editDataBytesRead = _myServer->getOctree()->processEditPacketData(packetType, reinterpret_cast(packet.data()), @@ -165,6 +168,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin << "editDataBytesRead=" << editDataBytesRead; } + qDebug() << "{" << QThread::currentThread() << "} " << "TREE UNLOCKED AFTER EDIT now:" << usecTimestampNow(); _myServer->getOctree()->unlock(); quint64 endProcess = usecTimestampNow(); diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 2d8d8d357e..1b3d3730a5 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -316,6 +316,7 @@ void OctreeQueryNode::updateLastKnownViewFrustum() { // save that we know the view has been sent. quint64 now = usecTimestampNow(); setLastTimeBagEmpty(now); // is this what we want? poor names + //qDebug() << "{" << QThread::currentThread() << "} " << " nodeData->setLastTimeBagEmpty() now:" << now; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index f905ae652f..46e0da18aa 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -344,6 +344,14 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // only set our last sent time if we weren't resetting due to frustum change quint64 now = usecTimestampNow(); nodeData->setLastTimeBagEmpty(now); + //qDebug() << "{" << QThread::currentThread() << "} " << " OctreeSendThread::packetDistributor().... bag is empty so we must have sent our view"; + //qDebug() << "{" << QThread::currentThread() << "} " << " _nodeUUID:" << _nodeUUID; + if (_node->getActiveSocket()) { + //qDebug() << "{" << QThread::currentThread() << "} " << " _node active socket:" << *(_node->getActiveSocket()); + } else { + //qDebug() << "{" << QThread::currentThread() << "} " << " _node active socket:" << "????"; + } + //qDebug() << "{" << QThread::currentThread() << "} " << " nodeData->setLastTimeBagEmpty() now:" << now; } // track completed scenes and send out the stats packet accordingly @@ -450,13 +458,22 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus quint64 lockWaitStart = usecTimestampNow(); _myServer->getOctree()->lockForRead(); + //qDebug() << "{" << QThread::currentThread() << "} " << "TREE LOCKED FOR READ now:" << usecTimestampNow(); quint64 lockWaitEnd = usecTimestampNow(); lockWaitElapsedUsec = (float)(lockWaitEnd - lockWaitStart); quint64 encodeStart = usecTimestampNow(); - bytesWritten = _myServer->getOctree()->encodeTreeBitstream(subTree, &_packetData, nodeData->elementBag, params); + //qDebug() << "{" << QThread::currentThread() << "} " << " OctreeSendThread::packetDistributor()...."; + //qDebug() << "{" << QThread::currentThread() << "} " << " _nodeUUID:" << _nodeUUID; + AACube subTreeCube = subTree->getAACube(); + subTreeCube.scale((float)TREE_SCALE); + //qDebug() << "{" << QThread::currentThread() << "} " << " subTree:" << subTreeCube; + //qDebug() << "{" << QThread::currentThread() << "} " << " subTree->getLastChanged():" << subTree->getLastChanged(); + + bytesWritten = _myServer->getOctree()->encodeTreeBitstream(subTree, &_packetData, nodeData->elementBag, params); + quint64 encodeEnd = usecTimestampNow(); encodeElapsedUsec = (float)(encodeEnd - encodeStart); @@ -465,6 +482,18 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // the packet and send it completedScene = nodeData->elementBag.isEmpty(); + //qDebug() << "{" << QThread::currentThread() << "} " << " OctreeSendThread::packetDistributor()...."; + //qDebug() << "{" << QThread::currentThread() << "} " << " _nodeUUID:" << _nodeUUID; + if (_node->getActiveSocket()) { + //qDebug() << "{" << QThread::currentThread() << "} " << " _node active socket:" << *(_node->getActiveSocket()); + } else { + //qDebug() << "{" << QThread::currentThread() << "} " << " _node active socket:" << "????"; + } + //qDebug() << "{" << QThread::currentThread() << "} " << " params.lastViewFrustumSent:" << params.lastViewFrustumSent; + //qDebug() << "{" << QThread::currentThread() << "} " << " params.stopReason:" << params.getStopReason(); + //qDebug() << "{" << QThread::currentThread() << "} " << " bytesWritten:" << bytesWritten; + //qDebug() << "{" << QThread::currentThread() << "} " << " completedScene:" << completedScene; + // if we're trying to fill a full size packet, then we use this logic to determine if we have a DIDNT_FIT case. if (_packetData.getTargetSize() == MAX_OCTREE_PACKET_DATA_SIZE) { if (_packetData.hasContent() && bytesWritten == 0 && @@ -482,6 +511,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus } nodeData->stats.encodeStopped(); + //qDebug() << "{" << QThread::currentThread() << "} " << "TREE UNLOCKED AFTER READ now:" << usecTimestampNow(); _myServer->getOctree()->unlock(); } else { // If the bag was empty then we didn't even attempt to encode, and so we know the bytesWritten were 0 @@ -598,6 +628,7 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // if after sending packets we've emptied our bag, then we want to remember that we've sent all // the voxels from the current view frustum if (nodeData->elementBag.isEmpty()) { + //qDebug() << "{" << QThread::currentThread() << "} " << " nodeData->updateLastKnownViewFrustum()"; nodeData->updateLastKnownViewFrustum(); nodeData->setViewSent(true); nodeData->map.erase(); // It would be nice if we could save this, and only reset it when the view frustum changes diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 346070c567..f56501f7de 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -59,6 +59,7 @@ void EntityItem::initFromEntityItemID(const EntityItemID& entityItemID) { _lastUpdated = 0; _created = 0; // TODO: when do we actually want to make this "now" + _changedOnServer = 0; _position = glm::vec3(0,0,0); _rotation = DEFAULT_ROTATION; @@ -87,6 +88,7 @@ EntityItem::EntityItem(const EntityItemID& entityItemID) { _lastEditedFromRemoteInRemoteTime = 0; _lastUpdated = 0; _created = 0; + _changedOnServer = 0; initFromEntityItemID(entityItemID); } @@ -97,6 +99,7 @@ EntityItem::EntityItem(const EntityItemID& entityItemID, const EntityItemPropert _lastEditedFromRemoteInRemoteTime = 0; _lastUpdated = 0; _created = properties.getCreated(); + _changedOnServer = 0; initFromEntityItemID(entityItemID); setProperties(properties, true); // force copy } @@ -161,7 +164,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet quint64 lastEdited = getLastEdited(); - const bool wantDebug = false; + const bool wantDebug = true; if (wantDebug) { float editedAgo = getEditedAgo(); QString agoAsString = formatSecondsElapsed(editedAgo); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 2117ec25b0..ae44e3931b 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -70,10 +70,14 @@ public: /// Last edited time of this entity universal usecs quint64 getLastEdited() const { return _lastEdited; } - void setLastEdited(quint64 lastEdited) { _lastEdited = _lastUpdated = lastEdited; } + void setLastEdited(quint64 lastEdited) + { _lastEdited = _lastUpdated = lastEdited; _changedOnServer = glm::max(lastEdited, _changedOnServer); } float getEditedAgo() const /// Elapsed seconds since this entity was last edited { return (float)(usecTimestampNow() - getLastEdited()) / (float)USECS_PER_SECOND; } + void markAsChangedOnServer() { _changedOnServer = usecTimestampNow(); } + quint64 getLastChangedOnServer() const { return _changedOnServer; } + // TODO: eventually only include properties changed since the params.lastViewFrustumSent time virtual EntityPropertyFlags getEntityProperties(EncodeBitstreamParams& params) const; @@ -268,6 +272,7 @@ protected: quint64 _lastEditedFromRemote; // this is the last time we received and edit from the server quint64 _lastEditedFromRemoteInRemoteTime; // time in server time space the last time we received and edit from the server quint64 _created; + quint64 _changedOnServer; glm::vec3 _position; glm::vec3 _dimensions; diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 21df5498ec..4959e6f8e2 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -496,7 +496,10 @@ int EntityTree::processEditPacketData(PacketType packetType, const unsigned char // if the entityItem exists, then update it if (existingEntity) { + qDebug() << "Calling updateEntity() properties.getLastEdited(): " << properties.getLastEdited(); updateEntity(entityItemID, properties); + existingEntity->markAsChangedOnServer(); + qDebug() << "AFTER updateEntity() now: " << usecTimestampNow(); } else { qDebug() << "User attempted to edit an unknown entity. ID:" << entityItemID; } @@ -505,6 +508,7 @@ int EntityTree::processEditPacketData(PacketType packetType, const unsigned char entityItemID = assignEntityID(entityItemID); EntityItem* newEntity = addEntity(entityItemID, properties); if (newEntity) { + newEntity->markAsChangedOnServer(); notifyNewlyCreatedEntity(*newEntity, senderNode); } } @@ -551,6 +555,7 @@ void EntityTree::releaseSceneEncodeData(OctreeElementExtraEncodeData* extraEncod EntityTreeElementExtraEncodeData* thisExtraEncodeData = static_cast(extraData); delete thisExtraEncodeData; } + //qDebug() << "{" << QThread::currentThread() << "} " << "EntityTree::releaseSceneEncodeData()... now:" << usecTimestampNow(); extraEncodeData->clear(); } diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 59dce80ecc..c228dc4045 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -94,6 +94,7 @@ void EntityTreeElement::initializeExtraEncodeData(EncodeBitstreamParams& params) // TODO: some of these inserts might be redundant!!! extraEncodeData->insert(this, entityTreeElementExtraEncodeData); + //qDebug() << "{" << QThread::currentThread() << "} " << " STORING extraEncodeData->insert(this...) --- STORING EXTRA DATA...."; } } @@ -238,6 +239,12 @@ void EntityTreeElement::elementEncodeComplete(EncodeBitstreamParams& params, Oct OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData* packetData, EncodeBitstreamParams& params) const { + + //qDebug() << "{" << QThread::currentThread() << "} " << " TOP OF appendElementData()"; + AACube elementCube = getAACube(); + elementCube.scale(TREE_SCALE); + //qDebug() << "{" << QThread::currentThread() << "} " << " elementCube:" << elementCube; + //qDebug() << "{" << QThread::currentThread() << "} " << " getLastChanged():" << getLastChanged(); OctreeElement::AppendState appendElementState = OctreeElement::COMPLETED; // assume the best... @@ -248,7 +255,9 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData if (extraEncodeData && extraEncodeData->contains(this)) { entityTreeElementExtraEncodeData = static_cast(extraEncodeData->value(this)); hadElementExtraData = true; + //qDebug() << "{" << QThread::currentThread() << "} " << " extraEncodeData->contains(this) --- USING PREVIOUS EXTRA DATA...."; } else { + //qDebug() << "{" << QThread::currentThread() << "} " << " NOT extraEncodeData->contains(this) --- CREATING NEW EXTRA DATA...."; // if there wasn't one already, then create one entityTreeElementExtraEncodeData = new EntityTreeElementExtraEncodeData(); entityTreeElementExtraEncodeData->elementCompleted = (_entityItems->size() == 0); @@ -282,6 +291,8 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData uint16_t actualNumberOfEntities = 0; QVector indexesOfEntitiesToInclude; + //qDebug() << "{" << QThread::currentThread() << "} " << " entityTreeElementExtraEncodeData->elementCompleted:" << entityTreeElementExtraEncodeData->elementCompleted; + // It's possible that our element has been previous completed. In this case we'll simply not include any of our // entities for encoding. This is needed because we encode the element data at the "parent" level, and so we // need to handle the case where our sibling elements need encoding but we don't. @@ -289,7 +300,25 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData for (uint16_t i = 0; i < _entityItems->size(); i++) { EntityItem* entity = (*_entityItems)[i]; bool includeThisEntity = true; - if (!params.forceSendScene && entity->getLastEdited() < params.lastViewFrustumSent) { + + bool ignoreFromLastEdit = (entity->getLastEdited() < params.lastViewFrustumSent); + bool ignoreFromChangeOnServer = (entity->getLastChangedOnServer() < params.lastViewFrustumSent); + + if (ignoreFromChangeOnServer != ignoreFromLastEdit) { + qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE MISMATCH!!"; + qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE based on getLastEdited():" << ignoreFromLastEdit; + qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE based on getLastChangedOnServer():" << ignoreFromChangeOnServer; + qDebug() << "{" << QThread::currentThread() << "} " << "getLastEdited():" << entity->getLastEdited(); + qDebug() << "{" << QThread::currentThread() << "} " << "getLastChangedOnServer():" << entity->getLastChangedOnServer(); + qDebug() << "{" << QThread::currentThread() << "} " << "params.lastViewFrustumSent:" << params.lastViewFrustumSent; + } else { + qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE MATCH!! - " << ignoreFromLastEdit; + } + + if (!params.forceSendScene && entity->getLastChangedOnServer() < params.lastViewFrustumSent) { + qDebug() << "{" << QThread::currentThread() << "} " << " ignore this entity cause it hasn't changed i:" << i; + //qDebug() << "{" << QThread::currentThread() << "} " << " entity->getLastEdited():" << entity->getLastEdited(); + //qDebug() << "{" << QThread::currentThread() << "} " << " params.lastViewFrustumSent:" << params.lastViewFrustumSent; includeThisEntity = false; } @@ -314,6 +343,7 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData if (includeThisEntity) { indexesOfEntitiesToInclude << i; numberOfEntities++; + //qDebug() << "{" << QThread::currentThread() << "} " << " indexesOfEntitiesToInclude << i:" << i; } } } @@ -321,11 +351,18 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData int numberOfEntitiesOffset = packetData->getUncompressedByteOffset(); bool successAppendEntityCount = packetData->appendValue(numberOfEntities); + //qDebug() << "{" << QThread::currentThread() << "} " << " numberOfEntities:" << numberOfEntities; + //qDebug() << "{" << QThread::currentThread() << "} " << " successAppendEntityCount:" << successAppendEntityCount; + if (successAppendEntityCount) { foreach (uint16_t i, indexesOfEntitiesToInclude) { EntityItem* entity = (*_entityItems)[i]; LevelDetails entityLevel = packetData->startLevel(); + + //qDebug() << "{" << QThread::currentThread() << "} " << "CALLING entity->appendEntityData()..."; + //qDebug() << "{" << QThread::currentThread() << "} " << " entity->getEntityItemID():" << entity->getEntityItemID(); + //qDebug() << "{" << QThread::currentThread() << "} " << " entity->getLastEdited():" << entity->getLastEdited(); OctreeElement::AppendState appendEntityState = entity->appendEntityData(packetData, params, entityTreeElementExtraEncodeData); @@ -375,6 +412,9 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData } else { // TODO: some of these inserts might be redundant!!! extraEncodeData->insert(this, entityTreeElementExtraEncodeData); + + //qDebug() << "{" << QThread::currentThread() << "} " << " STORING extraEncodeData->insert(this...) --- STORING EXTRA DATA...."; + } } else { @@ -383,11 +423,13 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData // If all of our items have been encoded, then we are complete as an element. if (entityTreeElementExtraEncodeData->entities.size() == 0) { entityTreeElementExtraEncodeData->elementCompleted = true; + //qDebug() << "{" << QThread::currentThread() << "} " << " MARKING ENTITY AS DONE .... entityTreeElementExtraEncodeData->elementCompleted = true.... now:" << usecTimestampNow(); } } // TODO: some of these inserts might be redundant!!! extraEncodeData->insert(this, entityTreeElementExtraEncodeData); + //qDebug() << "{" << QThread::currentThread() << "} " << " STORING extraEncodeData->insert(this...) --- STORING EXTRA DATA...."; } } diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index ceda91a441..4cbfc5cf93 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -19,6 +19,7 @@ #include // to load voxels from file #include +#include #include #include @@ -1087,6 +1088,9 @@ int Octree::encodeTreeBitstream(OctreeElement* element, if (suppressEmptySubtrees() && params.includeColor && childBytesWritten == 2) { childBytesWritten = 0; //params.stopReason = EncodeBitstreamParams::UNKNOWN; // possibly should be DIDNT_FIT... + //qDebug() << "{" << QThread::currentThread() << "} " << "EncodeBitstreamParams::UNKNOWN???? line:" << __LINE__; + + } // if we wrote child bytes, then return our result of all bytes written @@ -1096,6 +1100,7 @@ int Octree::encodeTreeBitstream(OctreeElement* element, // otherwise... if we didn't write any child bytes, then pretend like we also didn't write our octal code bytesWritten = 0; //params.stopReason = EncodeBitstreamParams::DIDNT_FIT; + //qDebug() << "{" << QThread::currentThread() << "} " << "EncodeBitstreamParams::UNKNOWN???? line:" << __LINE__; } if (bytesWritten == 0) { @@ -1231,6 +1236,9 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, if (params.stats) { params.stats->skippedNoChange(element); } + //qDebug() << "{" << QThread::currentThread() << "} " << "params.stopReason = EncodeBitstreamParams::NO_CHANGE ... "; + //qDebug() << "{" << QThread::currentThread() << "} " << " params.lastViewFrustumSent:" << params.lastViewFrustumSent; + //qDebug() << "{" << QThread::currentThread() << "} " << " element->getLastChanged():" << element->getLastChanged(); params.stopReason = EncodeBitstreamParams::NO_CHANGE; return bytesAtThisLevel; } @@ -1521,6 +1529,12 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, // to be completed. LevelDetails childDataLevelKey = packetData->startLevel(); + //qDebug() << "{" << QThread::currentThread() << "} " << "appendElementData()"; + AACube childElementCube = childElement->getAACube(); + childElementCube.scale(TREE_SCALE); + //qDebug() << "{" << QThread::currentThread() << "} " << " childElementCube:" << childElementCube; + //qDebug() << "{" << QThread::currentThread() << "} " << " childElement->getLastChanged():" << childElement->getLastChanged(); + OctreeElement::AppendState childAppendState = childElement->appendElementData(packetData, params); // allow our tree subclass to do any additional bookkeeping it needs to do with encoded data state @@ -1872,6 +1886,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, element->elementEncodeComplete(params, &bag); } + //qDebug() << "{" << QThread::currentThread() << "} " << "got to bottom... didn't set stopReason..."; return bytesAtThisLevel; } From 5333f0eb19c337f524cded6e2ca11916dbb81ed6 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Nov 2014 13:45:30 -0800 Subject: [PATCH 2/5] quiet some debug --- libraries/entities/src/EntityItem.cpp | 2 +- libraries/entities/src/EntityTreeElement.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index f56501f7de..ef02aafbc8 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -164,7 +164,7 @@ OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packet quint64 lastEdited = getLastEdited(); - const bool wantDebug = true; + const bool wantDebug = false; if (wantDebug) { float editedAgo = getEditedAgo(); QString agoAsString = formatSecondsElapsed(editedAgo); diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index c228dc4045..71a50d6f5d 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -312,11 +312,11 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData qDebug() << "{" << QThread::currentThread() << "} " << "getLastChangedOnServer():" << entity->getLastChangedOnServer(); qDebug() << "{" << QThread::currentThread() << "} " << "params.lastViewFrustumSent:" << params.lastViewFrustumSent; } else { - qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE MATCH!! - " << ignoreFromLastEdit; + //qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE MATCH!! - " << ignoreFromLastEdit; } if (!params.forceSendScene && entity->getLastChangedOnServer() < params.lastViewFrustumSent) { - qDebug() << "{" << QThread::currentThread() << "} " << " ignore this entity cause it hasn't changed i:" << i; + //qDebug() << "{" << QThread::currentThread() << "} " << " ignore this entity cause it hasn't changed i:" << i; //qDebug() << "{" << QThread::currentThread() << "} " << " entity->getLastEdited():" << entity->getLastEdited(); //qDebug() << "{" << QThread::currentThread() << "} " << " params.lastViewFrustumSent:" << params.lastViewFrustumSent; includeThisEntity = false; From 3c7b06f1d2f5c0e63ddda0e9881ff387672e10d8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Nov 2014 13:45:38 -0800 Subject: [PATCH 3/5] quiet some debug --- assignment-client/src/octree/OctreeInboundPacketProcessor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index f4e28d20e9..02b0bcd381 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -155,7 +155,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin quint64 startLock = usecTimestampNow(); _myServer->getOctree()->lockForWrite(); - qDebug() << "{" << QThread::currentThread() << "} " << "TREE LOCKED FOR EDIT now:" << usecTimestampNow(); + //qDebug() << "{" << QThread::currentThread() << "} " << "TREE LOCKED FOR EDIT now:" << usecTimestampNow(); quint64 startProcess = usecTimestampNow(); int editDataBytesRead = _myServer->getOctree()->processEditPacketData(packetType, @@ -168,7 +168,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin << "editDataBytesRead=" << editDataBytesRead; } - qDebug() << "{" << QThread::currentThread() << "} " << "TREE UNLOCKED AFTER EDIT now:" << usecTimestampNow(); + //qDebug() << "{" << QThread::currentThread() << "} " << "TREE UNLOCKED AFTER EDIT now:" << usecTimestampNow(); _myServer->getOctree()->unlock(); quint64 endProcess = usecTimestampNow(); From 90b079d5a8bceb4b2fe4f22299dc793d2b5ed54e Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Nov 2014 13:51:48 -0800 Subject: [PATCH 4/5] remove debug --- .../octree/OctreeInboundPacketProcessor.cpp | 3 -- .../src/octree/OctreeQueryNode.cpp | 1 - .../src/octree/OctreeSendThread.cpp | 32 --------------- libraries/entities/src/EntityTree.cpp | 1 - libraries/entities/src/EntityTreeElement.cpp | 40 ------------------- libraries/octree/src/Octree.cpp | 14 ------- 6 files changed, 91 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 02b0bcd381..e98e964691 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -155,8 +155,6 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin quint64 startLock = usecTimestampNow(); _myServer->getOctree()->lockForWrite(); - //qDebug() << "{" << QThread::currentThread() << "} " << "TREE LOCKED FOR EDIT now:" << usecTimestampNow(); - quint64 startProcess = usecTimestampNow(); int editDataBytesRead = _myServer->getOctree()->processEditPacketData(packetType, reinterpret_cast(packet.data()), @@ -168,7 +166,6 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin << "editDataBytesRead=" << editDataBytesRead; } - //qDebug() << "{" << QThread::currentThread() << "} " << "TREE UNLOCKED AFTER EDIT now:" << usecTimestampNow(); _myServer->getOctree()->unlock(); quint64 endProcess = usecTimestampNow(); diff --git a/assignment-client/src/octree/OctreeQueryNode.cpp b/assignment-client/src/octree/OctreeQueryNode.cpp index 1b3d3730a5..2d8d8d357e 100644 --- a/assignment-client/src/octree/OctreeQueryNode.cpp +++ b/assignment-client/src/octree/OctreeQueryNode.cpp @@ -316,7 +316,6 @@ void OctreeQueryNode::updateLastKnownViewFrustum() { // save that we know the view has been sent. quint64 now = usecTimestampNow(); setLastTimeBagEmpty(now); // is this what we want? poor names - //qDebug() << "{" << QThread::currentThread() << "} " << " nodeData->setLastTimeBagEmpty() now:" << now; } diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index 46e0da18aa..46ea49e9a7 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -344,14 +344,6 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // only set our last sent time if we weren't resetting due to frustum change quint64 now = usecTimestampNow(); nodeData->setLastTimeBagEmpty(now); - //qDebug() << "{" << QThread::currentThread() << "} " << " OctreeSendThread::packetDistributor().... bag is empty so we must have sent our view"; - //qDebug() << "{" << QThread::currentThread() << "} " << " _nodeUUID:" << _nodeUUID; - if (_node->getActiveSocket()) { - //qDebug() << "{" << QThread::currentThread() << "} " << " _node active socket:" << *(_node->getActiveSocket()); - } else { - //qDebug() << "{" << QThread::currentThread() << "} " << " _node active socket:" << "????"; - } - //qDebug() << "{" << QThread::currentThread() << "} " << " nodeData->setLastTimeBagEmpty() now:" << now; } // track completed scenes and send out the stats packet accordingly @@ -458,20 +450,10 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus quint64 lockWaitStart = usecTimestampNow(); _myServer->getOctree()->lockForRead(); - //qDebug() << "{" << QThread::currentThread() << "} " << "TREE LOCKED FOR READ now:" << usecTimestampNow(); quint64 lockWaitEnd = usecTimestampNow(); lockWaitElapsedUsec = (float)(lockWaitEnd - lockWaitStart); - quint64 encodeStart = usecTimestampNow(); - //qDebug() << "{" << QThread::currentThread() << "} " << " OctreeSendThread::packetDistributor()...."; - //qDebug() << "{" << QThread::currentThread() << "} " << " _nodeUUID:" << _nodeUUID; - AACube subTreeCube = subTree->getAACube(); - subTreeCube.scale((float)TREE_SCALE); - //qDebug() << "{" << QThread::currentThread() << "} " << " subTree:" << subTreeCube; - //qDebug() << "{" << QThread::currentThread() << "} " << " subTree->getLastChanged():" << subTree->getLastChanged(); - - bytesWritten = _myServer->getOctree()->encodeTreeBitstream(subTree, &_packetData, nodeData->elementBag, params); quint64 encodeEnd = usecTimestampNow(); @@ -482,18 +464,6 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // the packet and send it completedScene = nodeData->elementBag.isEmpty(); - //qDebug() << "{" << QThread::currentThread() << "} " << " OctreeSendThread::packetDistributor()...."; - //qDebug() << "{" << QThread::currentThread() << "} " << " _nodeUUID:" << _nodeUUID; - if (_node->getActiveSocket()) { - //qDebug() << "{" << QThread::currentThread() << "} " << " _node active socket:" << *(_node->getActiveSocket()); - } else { - //qDebug() << "{" << QThread::currentThread() << "} " << " _node active socket:" << "????"; - } - //qDebug() << "{" << QThread::currentThread() << "} " << " params.lastViewFrustumSent:" << params.lastViewFrustumSent; - //qDebug() << "{" << QThread::currentThread() << "} " << " params.stopReason:" << params.getStopReason(); - //qDebug() << "{" << QThread::currentThread() << "} " << " bytesWritten:" << bytesWritten; - //qDebug() << "{" << QThread::currentThread() << "} " << " completedScene:" << completedScene; - // if we're trying to fill a full size packet, then we use this logic to determine if we have a DIDNT_FIT case. if (_packetData.getTargetSize() == MAX_OCTREE_PACKET_DATA_SIZE) { if (_packetData.hasContent() && bytesWritten == 0 && @@ -511,7 +481,6 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus } nodeData->stats.encodeStopped(); - //qDebug() << "{" << QThread::currentThread() << "} " << "TREE UNLOCKED AFTER READ now:" << usecTimestampNow(); _myServer->getOctree()->unlock(); } else { // If the bag was empty then we didn't even attempt to encode, and so we know the bytesWritten were 0 @@ -628,7 +597,6 @@ int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrus // if after sending packets we've emptied our bag, then we want to remember that we've sent all // the voxels from the current view frustum if (nodeData->elementBag.isEmpty()) { - //qDebug() << "{" << QThread::currentThread() << "} " << " nodeData->updateLastKnownViewFrustum()"; nodeData->updateLastKnownViewFrustum(); nodeData->setViewSent(true); nodeData->map.erase(); // It would be nice if we could save this, and only reset it when the view frustum changes diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index 4959e6f8e2..af0aee7858 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -555,7 +555,6 @@ void EntityTree::releaseSceneEncodeData(OctreeElementExtraEncodeData* extraEncod EntityTreeElementExtraEncodeData* thisExtraEncodeData = static_cast(extraData); delete thisExtraEncodeData; } - //qDebug() << "{" << QThread::currentThread() << "} " << "EntityTree::releaseSceneEncodeData()... now:" << usecTimestampNow(); extraEncodeData->clear(); } diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index 71a50d6f5d..ceefc88ba7 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -94,7 +94,6 @@ void EntityTreeElement::initializeExtraEncodeData(EncodeBitstreamParams& params) // TODO: some of these inserts might be redundant!!! extraEncodeData->insert(this, entityTreeElementExtraEncodeData); - //qDebug() << "{" << QThread::currentThread() << "} " << " STORING extraEncodeData->insert(this...) --- STORING EXTRA DATA...."; } } @@ -240,12 +239,6 @@ void EntityTreeElement::elementEncodeComplete(EncodeBitstreamParams& params, Oct OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData* packetData, EncodeBitstreamParams& params) const { - //qDebug() << "{" << QThread::currentThread() << "} " << " TOP OF appendElementData()"; - AACube elementCube = getAACube(); - elementCube.scale(TREE_SCALE); - //qDebug() << "{" << QThread::currentThread() << "} " << " elementCube:" << elementCube; - //qDebug() << "{" << QThread::currentThread() << "} " << " getLastChanged():" << getLastChanged(); - OctreeElement::AppendState appendElementState = OctreeElement::COMPLETED; // assume the best... // first, check the params.extraEncodeData to see if there's any partial re-encode data for this element @@ -255,9 +248,7 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData if (extraEncodeData && extraEncodeData->contains(this)) { entityTreeElementExtraEncodeData = static_cast(extraEncodeData->value(this)); hadElementExtraData = true; - //qDebug() << "{" << QThread::currentThread() << "} " << " extraEncodeData->contains(this) --- USING PREVIOUS EXTRA DATA...."; } else { - //qDebug() << "{" << QThread::currentThread() << "} " << " NOT extraEncodeData->contains(this) --- CREATING NEW EXTRA DATA...."; // if there wasn't one already, then create one entityTreeElementExtraEncodeData = new EntityTreeElementExtraEncodeData(); entityTreeElementExtraEncodeData->elementCompleted = (_entityItems->size() == 0); @@ -291,8 +282,6 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData uint16_t actualNumberOfEntities = 0; QVector indexesOfEntitiesToInclude; - //qDebug() << "{" << QThread::currentThread() << "} " << " entityTreeElementExtraEncodeData->elementCompleted:" << entityTreeElementExtraEncodeData->elementCompleted; - // It's possible that our element has been previous completed. In this case we'll simply not include any of our // entities for encoding. This is needed because we encode the element data at the "parent" level, and so we // need to handle the case where our sibling elements need encoding but we don't. @@ -301,24 +290,7 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData EntityItem* entity = (*_entityItems)[i]; bool includeThisEntity = true; - bool ignoreFromLastEdit = (entity->getLastEdited() < params.lastViewFrustumSent); - bool ignoreFromChangeOnServer = (entity->getLastChangedOnServer() < params.lastViewFrustumSent); - - if (ignoreFromChangeOnServer != ignoreFromLastEdit) { - qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE MISMATCH!!"; - qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE based on getLastEdited():" << ignoreFromLastEdit; - qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE based on getLastChangedOnServer():" << ignoreFromChangeOnServer; - qDebug() << "{" << QThread::currentThread() << "} " << "getLastEdited():" << entity->getLastEdited(); - qDebug() << "{" << QThread::currentThread() << "} " << "getLastChangedOnServer():" << entity->getLastChangedOnServer(); - qDebug() << "{" << QThread::currentThread() << "} " << "params.lastViewFrustumSent:" << params.lastViewFrustumSent; - } else { - //qDebug() << "{" << QThread::currentThread() << "} " << "IGNORE MATCH!! - " << ignoreFromLastEdit; - } - if (!params.forceSendScene && entity->getLastChangedOnServer() < params.lastViewFrustumSent) { - //qDebug() << "{" << QThread::currentThread() << "} " << " ignore this entity cause it hasn't changed i:" << i; - //qDebug() << "{" << QThread::currentThread() << "} " << " entity->getLastEdited():" << entity->getLastEdited(); - //qDebug() << "{" << QThread::currentThread() << "} " << " params.lastViewFrustumSent:" << params.lastViewFrustumSent; includeThisEntity = false; } @@ -343,7 +315,6 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData if (includeThisEntity) { indexesOfEntitiesToInclude << i; numberOfEntities++; - //qDebug() << "{" << QThread::currentThread() << "} " << " indexesOfEntitiesToInclude << i:" << i; } } } @@ -351,18 +322,12 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData int numberOfEntitiesOffset = packetData->getUncompressedByteOffset(); bool successAppendEntityCount = packetData->appendValue(numberOfEntities); - //qDebug() << "{" << QThread::currentThread() << "} " << " numberOfEntities:" << numberOfEntities; - //qDebug() << "{" << QThread::currentThread() << "} " << " successAppendEntityCount:" << successAppendEntityCount; - if (successAppendEntityCount) { foreach (uint16_t i, indexesOfEntitiesToInclude) { EntityItem* entity = (*_entityItems)[i]; LevelDetails entityLevel = packetData->startLevel(); - //qDebug() << "{" << QThread::currentThread() << "} " << "CALLING entity->appendEntityData()..."; - //qDebug() << "{" << QThread::currentThread() << "} " << " entity->getEntityItemID():" << entity->getEntityItemID(); - //qDebug() << "{" << QThread::currentThread() << "} " << " entity->getLastEdited():" << entity->getLastEdited(); OctreeElement::AppendState appendEntityState = entity->appendEntityData(packetData, params, entityTreeElementExtraEncodeData); @@ -412,9 +377,6 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData } else { // TODO: some of these inserts might be redundant!!! extraEncodeData->insert(this, entityTreeElementExtraEncodeData); - - //qDebug() << "{" << QThread::currentThread() << "} " << " STORING extraEncodeData->insert(this...) --- STORING EXTRA DATA...."; - } } else { @@ -423,13 +385,11 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData // If all of our items have been encoded, then we are complete as an element. if (entityTreeElementExtraEncodeData->entities.size() == 0) { entityTreeElementExtraEncodeData->elementCompleted = true; - //qDebug() << "{" << QThread::currentThread() << "} " << " MARKING ENTITY AS DONE .... entityTreeElementExtraEncodeData->elementCompleted = true.... now:" << usecTimestampNow(); } } // TODO: some of these inserts might be redundant!!! extraEncodeData->insert(this, entityTreeElementExtraEncodeData); - //qDebug() << "{" << QThread::currentThread() << "} " << " STORING extraEncodeData->insert(this...) --- STORING EXTRA DATA...."; } } diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 4cbfc5cf93..24c7499f9d 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -1088,9 +1088,6 @@ int Octree::encodeTreeBitstream(OctreeElement* element, if (suppressEmptySubtrees() && params.includeColor && childBytesWritten == 2) { childBytesWritten = 0; //params.stopReason = EncodeBitstreamParams::UNKNOWN; // possibly should be DIDNT_FIT... - //qDebug() << "{" << QThread::currentThread() << "} " << "EncodeBitstreamParams::UNKNOWN???? line:" << __LINE__; - - } // if we wrote child bytes, then return our result of all bytes written @@ -1100,7 +1097,6 @@ int Octree::encodeTreeBitstream(OctreeElement* element, // otherwise... if we didn't write any child bytes, then pretend like we also didn't write our octal code bytesWritten = 0; //params.stopReason = EncodeBitstreamParams::DIDNT_FIT; - //qDebug() << "{" << QThread::currentThread() << "} " << "EncodeBitstreamParams::UNKNOWN???? line:" << __LINE__; } if (bytesWritten == 0) { @@ -1236,9 +1232,6 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, if (params.stats) { params.stats->skippedNoChange(element); } - //qDebug() << "{" << QThread::currentThread() << "} " << "params.stopReason = EncodeBitstreamParams::NO_CHANGE ... "; - //qDebug() << "{" << QThread::currentThread() << "} " << " params.lastViewFrustumSent:" << params.lastViewFrustumSent; - //qDebug() << "{" << QThread::currentThread() << "} " << " element->getLastChanged():" << element->getLastChanged(); params.stopReason = EncodeBitstreamParams::NO_CHANGE; return bytesAtThisLevel; } @@ -1529,12 +1522,6 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, // to be completed. LevelDetails childDataLevelKey = packetData->startLevel(); - //qDebug() << "{" << QThread::currentThread() << "} " << "appendElementData()"; - AACube childElementCube = childElement->getAACube(); - childElementCube.scale(TREE_SCALE); - //qDebug() << "{" << QThread::currentThread() << "} " << " childElementCube:" << childElementCube; - //qDebug() << "{" << QThread::currentThread() << "} " << " childElement->getLastChanged():" << childElement->getLastChanged(); - OctreeElement::AppendState childAppendState = childElement->appendElementData(packetData, params); // allow our tree subclass to do any additional bookkeeping it needs to do with encoded data state @@ -1886,7 +1873,6 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElement* element, element->elementEncodeComplete(params, &bag); } - //qDebug() << "{" << QThread::currentThread() << "} " << "got to bottom... didn't set stopReason..."; return bytesAtThisLevel; } From 768a854b00033c3ed4e896bc473fd2e854603462 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Nov 2014 14:00:26 -0800 Subject: [PATCH 5/5] cleanup --- assignment-client/src/octree/OctreeInboundPacketProcessor.cpp | 1 - libraries/entities/src/EntityTree.cpp | 2 -- libraries/entities/src/EntityTreeElement.cpp | 2 -- libraries/octree/src/Octree.cpp | 1 - 4 files changed, 6 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index e98e964691..b9bde8d544 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -154,7 +154,6 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin quint64 startLock = usecTimestampNow(); _myServer->getOctree()->lockForWrite(); - quint64 startProcess = usecTimestampNow(); int editDataBytesRead = _myServer->getOctree()->processEditPacketData(packetType, reinterpret_cast(packet.data()), diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index af0aee7858..f31f21ebe9 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -496,10 +496,8 @@ int EntityTree::processEditPacketData(PacketType packetType, const unsigned char // if the entityItem exists, then update it if (existingEntity) { - qDebug() << "Calling updateEntity() properties.getLastEdited(): " << properties.getLastEdited(); updateEntity(entityItemID, properties); existingEntity->markAsChangedOnServer(); - qDebug() << "AFTER updateEntity() now: " << usecTimestampNow(); } else { qDebug() << "User attempted to edit an unknown entity. ID:" << entityItemID; } diff --git a/libraries/entities/src/EntityTreeElement.cpp b/libraries/entities/src/EntityTreeElement.cpp index ceefc88ba7..079fb1bba7 100644 --- a/libraries/entities/src/EntityTreeElement.cpp +++ b/libraries/entities/src/EntityTreeElement.cpp @@ -325,9 +325,7 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData if (successAppendEntityCount) { foreach (uint16_t i, indexesOfEntitiesToInclude) { EntityItem* entity = (*_entityItems)[i]; - LevelDetails entityLevel = packetData->startLevel(); - OctreeElement::AppendState appendEntityState = entity->appendEntityData(packetData, params, entityTreeElementExtraEncodeData); diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 24c7499f9d..ceda91a441 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -19,7 +19,6 @@ #include // to load voxels from file #include -#include #include #include