Move sending of completion packet up to EntityTreeSendThread

I hadn't appreciated the continuous nature of the scene
traversal. Looks good now. Also changed some identifier names.
This commit is contained in:
Simon Walton 2018-07-25 17:05:05 -07:00
parent 8f02834447
commit 2c06487df0
6 changed files with 28 additions and 24 deletions

View file

@ -18,7 +18,7 @@
#include "EntityServer.h"
// Initially just send all items within this distance.
const float EntityTreeSendThread::INITIAL_RADIUS = 50.0f;
const float EntityTreeSendThread::INITIAL_RADIUS = 10.0f;
EntityTreeSendThread::EntityTreeSendThread(OctreeServer* myServer, const SharedNodePointer& node) :
OctreeSendThread(myServer, node)
@ -102,7 +102,7 @@ void EntityTreeSendThread::preDistributionProcessing() {
}
}
void EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData,
bool EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData,
bool viewFrustumChanged, bool isFullScene) {
if (viewFrustumChanged || _traversal.finished()) {
EntityTreeElementPointer root = std::dynamic_pointer_cast<EntityTreeElement>(_myServer->getOctree()->getRoot());
@ -114,7 +114,7 @@ void EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O
int32_t lodLevelOffset = nodeData->getBoundaryLevelAdjust() + (viewFrustumChanged ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST);
newView.lodScaleFactor = powf(2.0f, lodLevelOffset);
if (nodeData->wantReportInitialResult() && !newView.viewFrustums.empty()) {
if (nodeData->wantReportInitialCompletion() && !newView.viewFrustums.empty()) {
auto& mainView = newView.viewFrustums[0];
// Force acceptance within INITIAL_RADIUS.
mainView.setSimpleRadius(INITIAL_RADIUS);
@ -165,7 +165,20 @@ void EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O
OctreeServer::trackTreeTraverseTime((float)(usecTimestampNow() - startTime));
}
OctreeSendThread::traverseTreeAndSendContents(node, nodeData, viewFrustumChanged, isFullScene);
bool sendComplete = OctreeSendThread::traverseTreeAndSendContents(node, nodeData, viewFrustumChanged, isFullScene);
if (sendComplete && nodeData->wantReportInitialCompletion() && _traversal.finished()) {
// Dealt with all nearby entities.
nodeData->setReportInitialCompletion(false);
// Send EntityQueryInitialResultsComplete reliable packet ...
auto initialCompletion = NLPacket::create(PacketType::EntityQueryInitialResultsComplete, -1, true);
QDataStream initialCompletionStream(initialCompletion.get());
initialCompletionStream << _lastSequenceNumber;
DependencyManager::get<NodeList>()->sendPacket(std::move(initialCompletion), *node.data());
}
return sendComplete;
}
bool EntityTreeSendThread::addAncestorsToExtraFlaggedEntities(const QUuid& filteredEntityID,

View file

@ -31,7 +31,7 @@ public:
EntityTreeSendThread(OctreeServer* myServer, const SharedNodePointer& node);
protected:
void traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData,
bool traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData,
bool viewFrustumChanged, bool isFullScene) override;
private slots:

View file

@ -433,7 +433,7 @@ int OctreeSendThread::packetDistributor(SharedNodePointer node, OctreeQueryNode*
return _truePacketsSent;
}
void OctreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData, bool viewFrustumChanged, bool isFullScene) {
bool OctreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData, bool viewFrustumChanged, bool isFullScene) {
// calculate max number of packets that can be sent during this interval
int clientMaxPacketsPerInterval = std::max(1, (nodeData->getMaxQueryPacketsPerSecond() / INTERVALS_PER_SECOND));
int maxPacketsPerInterval = std::min(clientMaxPacketsPerInterval, _myServer->getPacketsPerClientPerInterval());
@ -511,20 +511,11 @@ void OctreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, Octre
OctreeServer::trackInsideTime((float)(usecTimestampNow() - startInside));
}
if (params.stopReason == EncodeBitstreamParams::FINISHED && nodeData->wantReportInitialResult()) {
// Dealt with nearby entities.
nodeData->setReportInitialResult(false);
// send EntityQueryInitialResultsComplete reliable packet ...
auto initialCompletion = NLPacket::create(PacketType::EntityQueryInitialResultsComplete, -1, true);
QDataStream initialCompletionStream(initialCompletion.get());
initialCompletionStream << _lastSequenceNumber;
DependencyManager::get<NodeList>()->sendPacket(std::move(initialCompletion), *node.data());
}
if (somethingToSend && _myServer->wantsVerboseDebug()) {
qCDebug(octree) << "Hit PPS Limit, packetsSentThisInterval =" << _packetsSentThisInterval
<< " maxPacketsPerInterval = " << maxPacketsPerInterval
<< " clientMaxPacketsPerInterval = " << clientMaxPacketsPerInterval;
}
return params.stopReason == EncodeBitstreamParams::FINISHED;
}

View file

@ -52,7 +52,7 @@ protected:
/// Implements generic processing behavior for this thread.
virtual bool process() override;
virtual void traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData,
virtual bool traverseTreeAndSendContents(SharedNodePointer node, OctreeQueryNode* nodeData,
bool viewFrustumChanged, bool isFullScene);
virtual bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) = 0;

View file

@ -82,7 +82,7 @@ int OctreeQuery::getBroadcastData(unsigned char* destinationBuffer) {
}
OctreeQueryFlags queryFlags { NoFlags };
queryFlags |= (_reportInitialResult ? OctreeQuery::WantInitialResult : 0);
queryFlags |= (_reportInitialCompletion ? OctreeQuery::WantInitialCompletion : 0);
memcpy(destinationBuffer, &queryFlags, sizeof(queryFlags));
destinationBuffer += sizeof(queryFlags);
@ -164,7 +164,7 @@ int OctreeQuery::parseData(ReceivedMessage& message) {
memcpy(&queryFlags, sourceBuffer, sizeof(queryFlags));
sourceBuffer += sizeof(queryFlags);
_reportInitialResult = bool(queryFlags & OctreeQueryFlags::WantInitialResult);
_reportInitialCompletion = bool(queryFlags & OctreeQueryFlags::WantInitialCompletion);
return sourceBuffer - startPosition;
}

View file

@ -53,8 +53,8 @@ public:
bool hasReceivedFirstQuery() const { return _hasReceivedFirstQuery; }
// Want a report when the initial query is complete.
bool wantReportInitialResult() const { return _reportInitialResult; }
void setReportInitialResult(bool reportInitialResult) { _reportInitialResult = reportInitialResult; }
bool wantReportInitialCompletion() const { return _reportInitialCompletion; }
void setReportInitialCompletion(bool reportInitialCompletion) { _reportInitialCompletion = reportInitialCompletion; }
signals:
void incomingConnectionIDChanged();
@ -78,11 +78,11 @@ protected:
QJsonObject _jsonParameters;
QReadWriteLock _jsonParametersLock;
enum OctreeQueryFlags : uint16_t { NoFlags = 0x0, WantInitialResult = 0x1 };
enum OctreeQueryFlags : uint16_t { NoFlags = 0x0, WantInitialCompletion = 0x1 };
friend const OctreeQuery::OctreeQueryFlags operator|=(OctreeQuery::OctreeQueryFlags& lhs, const int rhs);
bool _hasReceivedFirstQuery { false };
bool _reportInitialResult { false };
bool _reportInitialCompletion { false };
};
#endif // hifi_OctreeQuery_h