From a991b6d6195cd2c68e1463eda571093987b74ac8 Mon Sep 17 00:00:00 2001 From: Roxanne Skelly Date: Wed, 31 Jul 2019 16:59:21 -0700 Subject: [PATCH] BUGZ-1046 - send entity packets reliably for initial query --- assignment-client/src/entities/EntityTreeSendThread.cpp | 5 +++++ assignment-client/src/octree/OctreeSendThread.cpp | 9 +++++---- libraries/networking/src/udt/Packet.h | 1 + libraries/octree/src/OctreeQueryNode.cpp | 2 +- libraries/octree/src/OctreeSceneStats.h | 2 +- 5 files changed, 13 insertions(+), 6 deletions(-) diff --git a/assignment-client/src/entities/EntityTreeSendThread.cpp b/assignment-client/src/entities/EntityTreeSendThread.cpp index 2b964ae674..f00813b006 100644 --- a/assignment-client/src/entities/EntityTreeSendThread.cpp +++ b/assignment-client/src/entities/EntityTreeSendThread.cpp @@ -160,6 +160,11 @@ bool EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O if (sendComplete && nodeData->wantReportInitialCompletion() && _traversal.finished()) { // Dealt with all nearby entities. nodeData->setReportInitialCompletion(false); + // initial stats and entity packets are reliable until the initial query is complete + // to guarantee all entity data is available for safe landing/physics start. Afterwards + // the packets are unreliable for performance. + nodeData->stats.getStatsMessage().setReliable(false); + nodeData->getPacket().setReliable(false); // Send EntityQueryInitialResultsComplete reliable packet ... auto initialCompletion = NLPacket::create(PacketType::EntityQueryInitialResultsComplete, diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index af36df1eba..cf09a10e98 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -194,13 +194,13 @@ int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode* // actually send it OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->sendUnreliablePacket(statsPacket, *node); + DependencyManager::get()->sendPacket(NLPacket::createCopy(statsPacket), *node); } else { // not enough room in the packet, send two packets // first packet OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->sendUnreliablePacket(statsPacket, *node); + DependencyManager::get()->sendPacket(NLPacket::createCopy(statsPacket), *node); int numBytes = statsPacket.getDataSize(); _totalBytes += numBytes; @@ -230,7 +230,7 @@ int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode* // second packet OctreeServer::didCallWriteDatagram(this); - DependencyManager::get()->sendUnreliablePacket(sentPacket, *node); + DependencyManager::get()->sendPacket(NLPacket::createCopy(sentPacket), *node); numBytes = sentPacket.getDataSize(); _totalBytes += numBytes; @@ -263,7 +263,8 @@ int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode* // just send the octree packet OctreeServer::didCallWriteDatagram(this); NLPacket& sentPacket = nodeData->getPacket(); - DependencyManager::get()->sendUnreliablePacket(sentPacket, *node); + + DependencyManager::get()->sendPacket(NLPacket::createCopy(sentPacket), *node); int numBytes = sentPacket.getDataSize(); _totalBytes += numBytes; diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index cad5cccb0e..36098235f9 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -83,6 +83,7 @@ public: bool isPartOfMessage() const { return _isPartOfMessage; } bool isReliable() const { return _isReliable; } + void setReliable(bool reliable) { _isReliable = reliable; } ObfuscationLevel getObfuscationLevel() const { return _obfuscationLevel; } SequenceNumber getSequenceNumber() const { return _sequenceNumber; } diff --git a/libraries/octree/src/OctreeQueryNode.cpp b/libraries/octree/src/OctreeQueryNode.cpp index 0c1c108f68..5bce547a34 100644 --- a/libraries/octree/src/OctreeQueryNode.cpp +++ b/libraries/octree/src/OctreeQueryNode.cpp @@ -82,7 +82,7 @@ bool OctreeQueryNode::shouldSuppressDuplicatePacket() { void OctreeQueryNode::init() { _myPacketType = getMyPacketType(); - _octreePacket = NLPacket::create(getMyPacketType()); + _octreePacket = NLPacket::create(getMyPacketType(), -1, true); resetOctreePacket(); // don't bump sequence } diff --git a/libraries/octree/src/OctreeSceneStats.h b/libraries/octree/src/OctreeSceneStats.h index e1228609a6..f78e51081b 100644 --- a/libraries/octree/src/OctreeSceneStats.h +++ b/libraries/octree/src/OctreeSceneStats.h @@ -169,7 +169,7 @@ private: bool _isReadyToSend; - std::unique_ptr _statsPacket = NLPacket::create(PacketType::OctreeStats); + std::unique_ptr _statsPacket = NLPacket::create(PacketType::OctreeStats, -1, true); // scene timing data in usecs bool _isStarted;