first cut at fixing the scene not stable bug

This commit is contained in:
Brad Hefta-Gaub 2016-03-08 14:52:21 -08:00
parent 247ebb380b
commit 6d211dd4e5
11 changed files with 47 additions and 10 deletions

View file

@ -124,7 +124,7 @@ AtomicUIntStat OctreeSendThread::_totalSpecialPackets { 0 };
int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode* nodeData, int& trueBytesSent, int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode* nodeData, int& trueBytesSent,
int& truePacketsSent) { int& truePacketsSent, bool dontSuppressDuplicate) {
OctreeServer::didHandlePacketSend(this); OctreeServer::didHandlePacketSend(this);
// if we're shutting down, then exit early // if we're shutting down, then exit early
@ -141,7 +141,7 @@ int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode*
// Here's where we check to see if this packet is a duplicate of the last packet. If it is, we will silently // Here's where we check to see if this packet is a duplicate of the last packet. If it is, we will silently
// obscure the packet and not send it. This allows the callers and upper level logic to not need to know about // obscure the packet and not send it. This allows the callers and upper level logic to not need to know about
// this rate control savings. // this rate control savings.
if (nodeData->shouldSuppressDuplicatePacket()) { if (!dontSuppressDuplicate && nodeData->shouldSuppressDuplicatePacket()) {
nodeData->resetOctreePacket(); // we still need to reset it though! nodeData->resetOctreePacket(); // we still need to reset it though!
return packetsSent; // without sending... return packetsSent; // without sending...
} }
@ -356,7 +356,7 @@ int OctreeSendThread::packetDistributor(SharedNodePointer node, OctreeQueryNode*
//unsigned long encodeTime = nodeData->stats.getTotalEncodeTime(); //unsigned long encodeTime = nodeData->stats.getTotalEncodeTime();
//unsigned long elapsedTime = nodeData->stats.getElapsedTime(); //unsigned long elapsedTime = nodeData->stats.getElapsedTime();
int packetsJustSent = handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent); int packetsJustSent = handlePacketSend(node, nodeData, trueBytesSent, truePacketsSent, isFullScene);
packetsSentThisInterval += packetsJustSent; packetsSentThisInterval += packetsJustSent;
// If we're starting a full scene, then definitely we want to empty the elementBag // If we're starting a full scene, then definitely we want to empty the elementBag
@ -582,6 +582,14 @@ int OctreeSendThread::packetDistributor(SharedNodePointer node, OctreeQueryNode*
if (nodeData->elementBag.isEmpty()) { if (nodeData->elementBag.isEmpty()) {
nodeData->updateLastKnownViewFrustum(); nodeData->updateLastKnownViewFrustum();
nodeData->setViewSent(true); nodeData->setViewSent(true);
if (isFullScene) {
int thisTrueBytesSent = 0;
int thisTruePacketsSent = 0;
nodeData->stats.sceneCompleted();
// FIXME - are we accounting for packets sent correctly here????
int packetsJustSent = handlePacketSend(node, nodeData, thisTrueBytesSent, thisTruePacketsSent, true);
}
} }
} // end if bag wasn't empty, and so we sent stuff... } // end if bag wasn't empty, and so we sent stuff...

View file

@ -50,7 +50,7 @@ protected:
virtual bool process(); virtual bool process();
private: private:
int handlePacketSend(SharedNodePointer node, OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent); int handlePacketSend(SharedNodePointer node, OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent, bool dontSuppressDuplicate = false);
int packetDistributor(SharedNodePointer node, OctreeQueryNode* nodeData, bool viewFrustumChanged); int packetDistributor(SharedNodePointer node, OctreeQueryNode* nodeData, bool viewFrustumChanged);

View file

@ -220,6 +220,11 @@ void OctreeStatsDialog::paintEvent(QPaintEvent* event) {
} else { } else {
sendingMode << "S"; sendingMode << "S";
} }
if (stats.isFullScene()) {
sendingMode << "F";
} else {
sendingMode << "p";
}
} }
}); });
sendingMode << " - " << serverCount << " servers"; sendingMode << " - " << serverCount << " servers";

View file

@ -224,6 +224,12 @@ void Stats::updateStats(bool force) {
} else { } else {
sendingModeStream << "S"; sendingModeStream << "S";
} }
if (stats.isFullScene()) {
sendingModeStream << "F";
}
else {
sendingModeStream << "p";
}
} }
// calculate server node totals // calculate server node totals

View file

@ -142,6 +142,7 @@ EntityPropertyFlags EntityItem::getEntityProperties(EncodeBitstreamParams& param
OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packetData, EncodeBitstreamParams& params, OctreeElement::AppendState EntityItem::appendEntityData(OctreePacketData* packetData, EncodeBitstreamParams& params,
EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData) const { EntityTreeElementExtraEncodeData* entityTreeElementExtraEncodeData) const {
// ALL this fits... // ALL this fits...
// object ID [16 bytes] // object ID [16 bytes]
// ByteCountCoded(type code) [~1 byte] // ByteCountCoded(type code) [~1 byte]

View file

@ -64,6 +64,7 @@ void EntityTreeElement::debugExtraEncodeData(EncodeBitstreamParams& params) cons
} }
void EntityTreeElement::initializeExtraEncodeData(EncodeBitstreamParams& params) { void EntityTreeElement::initializeExtraEncodeData(EncodeBitstreamParams& params) {
OctreeElementExtraEncodeData* extraEncodeData = params.extraEncodeData; OctreeElementExtraEncodeData* extraEncodeData = params.extraEncodeData;
assert(extraEncodeData); // EntityTrees always require extra encode data on their encoding passes assert(extraEncodeData); // EntityTrees always require extra encode data on their encoding passes
// Check to see if this element yet has encode data... if it doesn't create it // Check to see if this element yet has encode data... if it doesn't create it
@ -347,6 +348,12 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData
#endif #endif
indexesOfEntitiesToInclude << i; indexesOfEntitiesToInclude << i;
numberOfEntities++; numberOfEntities++;
} else {
// if the extra data included this entity, and we've decided to not include the entity, then
// we can treat it as if it was completed.
if (entityTreeElementExtraEncodeData->entities.contains(entity->getEntityItemID())) {
entityTreeElementExtraEncodeData->entities.remove(entity->getEntityItemID());
}
} }
} }
} }
@ -398,6 +405,9 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData
// After processing, if we are PARTIAL or COMPLETED then we need to re-include our extra data. // After processing, if we are PARTIAL or COMPLETED then we need to re-include our extra data.
// Only our parent can remove our extra data in these cases and only after it knows that all of its // Only our parent can remove our extra data in these cases and only after it knows that all of its
// children have been encoded. // children have been encoded.
//
// FIXME -- this comment seems wrong....
//
// If we weren't able to encode ANY data about ourselves, then we go ahead and remove our element data // If we weren't able to encode ANY data about ourselves, then we go ahead and remove our element data
// since that will signal that the entire element needs to be encoded on the next attempt // since that will signal that the entire element needs to be encoded on the next attempt
if (appendElementState == OctreeElement::NONE) { if (appendElementState == OctreeElement::NONE) {
@ -441,10 +451,13 @@ OctreeElement::AppendState EntityTreeElement::appendElementData(OctreePacketData
appendElementState = OctreeElement::NONE; appendElementState = OctreeElement::NONE;
} else { } else {
if (noEntitiesFit) { if (noEntitiesFit) {
appendElementState = OctreeElement::PARTIAL; //appendElementState = OctreeElement::PARTIAL;
} packetData->discardLevel(elementLevel);
appendElementState = OctreeElement::NONE;
} else {
packetData->endLevel(elementLevel); packetData->endLevel(elementLevel);
} }
}
return appendElementState; return appendElementState;
} }

View file

@ -942,7 +942,6 @@ int Octree::encodeTreeBitstream(OctreeElementPointer element,
int childBytesWritten = encodeTreeBitstreamRecursion(element, packetData, bag, params, int childBytesWritten = encodeTreeBitstreamRecursion(element, packetData, bag, params,
currentEncodeLevel, parentLocationThisView); currentEncodeLevel, parentLocationThisView);
// if childBytesWritten == 1 then something went wrong... that's not possible // if childBytesWritten == 1 then something went wrong... that's not possible
assert(childBytesWritten != 1); assert(childBytesWritten != 1);
@ -1529,7 +1528,6 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElementPointer element,
// If we made it this far, then we've written all of our child data... if this element is the root // If we made it this far, then we've written all of our child data... if this element is the root
// element, then we also allow the root element to write out it's data... // element, then we also allow the root element to write out it's data...
if (continueThisLevel && element == _rootElement && rootElementHasData()) { if (continueThisLevel && element == _rootElement && rootElementHasData()) {
int bytesBeforeChild = packetData->getUncompressedSize(); int bytesBeforeChild = packetData->getUncompressedSize();
// release the bytes we reserved... // release the bytes we reserved...
@ -1537,6 +1535,7 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElementPointer element,
LevelDetails rootDataLevelKey = packetData->startLevel(); LevelDetails rootDataLevelKey = packetData->startLevel();
OctreeElement::AppendState rootAppendState = element->appendElementData(packetData, params); OctreeElement::AppendState rootAppendState = element->appendElementData(packetData, params);
bool partOfRootFit = (rootAppendState != OctreeElement::NONE); bool partOfRootFit = (rootAppendState != OctreeElement::NONE);
bool allOfRootFit = (rootAppendState == OctreeElement::COMPLETED); bool allOfRootFit = (rootAppendState == OctreeElement::COMPLETED);
@ -1571,7 +1570,6 @@ int Octree::encodeTreeBitstreamRecursion(OctreeElementPointer element,
qCDebug(octree) << "WARNING UNEXPECTED CASE: Something failed in packing ROOT data"; qCDebug(octree) << "WARNING UNEXPECTED CASE: Something failed in packing ROOT data";
qCDebug(octree) << "This is not expected!!!! -- continueThisLevel=FALSE...."; qCDebug(octree) << "This is not expected!!!! -- continueThisLevel=FALSE....";
} }
} }
// if we were unable to fit this level in our packet, then rewind and add it to the element bag for // if we were unable to fit this level in our packet, then rewind and add it to the element bag for

View file

@ -34,6 +34,7 @@ public:
/// a single last item will be returned by extract as a null pointer /// a single last item will be returned by extract as a null pointer
void deleteAll(); void deleteAll();
size_t size() const { return _bagElements.size(); }
private: private:
Bag _bagElements; Bag _bagElements;

View file

@ -236,6 +236,8 @@ public:
/// the number of bytes in the packet currently reserved /// the number of bytes in the packet currently reserved
int getReservedBytes() { return _bytesReserved; } int getReservedBytes() { return _bytesReserved; }
int getBytesAvailable() { return _bytesAvailable; }
/// displays contents for debugging /// displays contents for debugging
void debugContent(); void debugContent();

View file

@ -149,6 +149,7 @@ public:
const std::vector<unsigned char*>& getJurisdictionEndNodes() const { return _jurisdictionEndNodes; } const std::vector<unsigned char*>& getJurisdictionEndNodes() const { return _jurisdictionEndNodes; }
bool isMoving() const { return _isMoving; } bool isMoving() const { return _isMoving; }
bool isFullScene() const { return _isFullScene; }
quint64 getTotalElements() const { return _totalElements; } quint64 getTotalElements() const { return _totalElements; }
quint64 getTotalInternal() const { return _totalInternal; } quint64 getTotalInternal() const { return _totalInternal; }
quint64 getTotalLeaves() const { return _totalLeaves; } quint64 getTotalLeaves() const { return _totalLeaves; }

View file

@ -258,9 +258,11 @@ template<typename Enum> inline void PropertyFlags<Enum>::debugDumpBits() {
qDebug() << "_minFlag=" << _minFlag; qDebug() << "_minFlag=" << _minFlag;
qDebug() << "_maxFlag=" << _maxFlag; qDebug() << "_maxFlag=" << _maxFlag;
qDebug() << "_trailingFlipped=" << _trailingFlipped; qDebug() << "_trailingFlipped=" << _trailingFlipped;
QString bits;
for(int i = 0; i < _flags.size(); i++) { for(int i = 0; i < _flags.size(); i++) {
qDebug() << "bit[" << i << "]=" << _flags.at(i); bits += (_flags.at(i) ? "1" : "0");
} }
qDebug() << "bits:" << bits;
} }