mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 12:09:52 +02:00
Implement client-side enable physics once indicated EntityData has arrived
Also now use Entity Server Protocol sequence numbers.
This commit is contained in:
parent
a15e78a0f4
commit
0cec9a72d6
8 changed files with 52 additions and 11 deletions
|
@ -174,7 +174,7 @@ bool EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O
|
||||||
// Send EntityQueryInitialResultsComplete reliable packet ...
|
// Send EntityQueryInitialResultsComplete reliable packet ...
|
||||||
auto initialCompletion = NLPacket::create(PacketType::EntityQueryInitialResultsComplete, -1, true);
|
auto initialCompletion = NLPacket::create(PacketType::EntityQueryInitialResultsComplete, -1, true);
|
||||||
QDataStream initialCompletionStream(initialCompletion.get());
|
QDataStream initialCompletionStream(initialCompletion.get());
|
||||||
initialCompletionStream << _lastSequenceNumber;
|
initialCompletionStream << OCTREE_PACKET_SEQUENCE(nodeData->getSequenceNumber() - 1U);
|
||||||
DependencyManager::get<NodeList>()->sendPacket(std::move(initialCompletion), *node.data());
|
DependencyManager::get<NodeList>()->sendPacket(std::move(initialCompletion), *node.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -195,7 +195,6 @@ int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode*
|
||||||
// actually send it
|
// actually send it
|
||||||
OctreeServer::didCallWriteDatagram(this);
|
OctreeServer::didCallWriteDatagram(this);
|
||||||
DependencyManager::get<NodeList>()->sendUnreliablePacket(statsPacket, *node);
|
DependencyManager::get<NodeList>()->sendUnreliablePacket(statsPacket, *node);
|
||||||
_lastSequenceNumber = (decltype(_lastSequenceNumber)) statsPacket.getSequenceNumber();
|
|
||||||
} else {
|
} else {
|
||||||
// not enough room in the packet, send two packets
|
// not enough room in the packet, send two packets
|
||||||
|
|
||||||
|
@ -232,7 +231,6 @@ int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode*
|
||||||
// second packet
|
// second packet
|
||||||
OctreeServer::didCallWriteDatagram(this);
|
OctreeServer::didCallWriteDatagram(this);
|
||||||
DependencyManager::get<NodeList>()->sendUnreliablePacket(sentPacket, *node);
|
DependencyManager::get<NodeList>()->sendUnreliablePacket(sentPacket, *node);
|
||||||
_lastSequenceNumber = (decltype(_lastSequenceNumber)) sentPacket.getSequenceNumber();
|
|
||||||
|
|
||||||
numBytes = sentPacket.getDataSize();
|
numBytes = sentPacket.getDataSize();
|
||||||
_totalBytes += numBytes;
|
_totalBytes += numBytes;
|
||||||
|
@ -266,7 +264,6 @@ int OctreeSendThread::handlePacketSend(SharedNodePointer node, OctreeQueryNode*
|
||||||
OctreeServer::didCallWriteDatagram(this);
|
OctreeServer::didCallWriteDatagram(this);
|
||||||
NLPacket& sentPacket = nodeData->getPacket();
|
NLPacket& sentPacket = nodeData->getPacket();
|
||||||
DependencyManager::get<NodeList>()->sendUnreliablePacket(sentPacket, *node);
|
DependencyManager::get<NodeList>()->sendUnreliablePacket(sentPacket, *node);
|
||||||
_lastSequenceNumber = (decltype(_lastSequenceNumber)) sentPacket.getSequenceNumber();
|
|
||||||
|
|
||||||
int numBytes = sentPacket.getDataSize();
|
int numBytes = sentPacket.getDataSize();
|
||||||
_totalBytes += numBytes;
|
_totalBytes += numBytes;
|
||||||
|
|
|
@ -60,7 +60,6 @@ protected:
|
||||||
QWeakPointer<Node> _node;
|
QWeakPointer<Node> _node;
|
||||||
OctreeServer* _myServer { nullptr };
|
OctreeServer* _myServer { nullptr };
|
||||||
QUuid _nodeUuid;
|
QUuid _nodeUuid;
|
||||||
udt::SequenceNumber::Type _lastSequenceNumber { 0 };
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Called before a packetDistributor pass to allow for pre-distribution processing
|
/// Called before a packetDistributor pass to allow for pre-distribution processing
|
||||||
|
|
|
@ -5476,8 +5476,9 @@ void Application::update(float deltaTime) {
|
||||||
// for nearby entities before starting bullet up.
|
// for nearby entities before starting bullet up.
|
||||||
quint64 now = usecTimestampNow();
|
quint64 now = usecTimestampNow();
|
||||||
const int PHYSICS_CHECK_TIMEOUT = 2 * USECS_PER_SECOND;
|
const int PHYSICS_CHECK_TIMEOUT = 2 * USECS_PER_SECOND;
|
||||||
|
auto entityTreeRenderer = getEntities();
|
||||||
if (now - _lastPhysicsCheckTime > PHYSICS_CHECK_TIMEOUT || _fullSceneReceivedCounter > _fullSceneCounterAtLastPhysicsCheck) {
|
if (entityTreeRenderer && _octreeProcessor.octreeSequenceIsComplete(entityTreeRenderer->getLastOctreeMessageSequence()) ) {
|
||||||
|
/*if (now - _lastPhysicsCheckTime > PHYSICS_CHECK_TIMEOUT || _fullSceneReceivedCounter > _fullSceneCounterAtLastPhysicsCheck) {*/
|
||||||
// we've received a new full-scene octree stats packet, or it's been long enough to try again anyway
|
// we've received a new full-scene octree stats packet, or it's been long enough to try again anyway
|
||||||
_lastPhysicsCheckTime = now;
|
_lastPhysicsCheckTime = now;
|
||||||
_fullSceneCounterAtLastPhysicsCheck = _fullSceneReceivedCounter;
|
_fullSceneCounterAtLastPhysicsCheck = _fullSceneReceivedCounter;
|
||||||
|
@ -6134,7 +6135,7 @@ void Application::queryOctree(NodeType_t serverType, PacketType packetType) {
|
||||||
auto lodManager = DependencyManager::get<LODManager>();
|
auto lodManager = DependencyManager::get<LODManager>();
|
||||||
_octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale());
|
_octreeQuery.setOctreeSizeScale(lodManager->getOctreeSizeScale());
|
||||||
_octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust());
|
_octreeQuery.setBoundaryLevelAdjust(lodManager->getBoundaryLevelAdjust());
|
||||||
_octreeQuery.setReportInitialCompletion(true);
|
_octreeQuery.setReportInitialCompletion(!_physicsEnabled);
|
||||||
|
|
||||||
auto nodeList = DependencyManager::get<NodeList>();
|
auto nodeList = DependencyManager::get<NodeList>();
|
||||||
|
|
||||||
|
@ -6279,6 +6280,7 @@ void Application::clearDomainOctreeDetails() {
|
||||||
_octreeServerSceneStats.clear();
|
_octreeServerSceneStats.clear();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_octreeProcessor.resetCompletionSequenceNumber();
|
||||||
// reset the model renderer
|
// reset the model renderer
|
||||||
getEntities()->clear();
|
getEntities()->clear();
|
||||||
|
|
||||||
|
|
|
@ -21,9 +21,9 @@ OctreePacketProcessor::OctreePacketProcessor() {
|
||||||
setObjectName("Octree Packet Processor");
|
setObjectName("Octree Packet Processor");
|
||||||
|
|
||||||
auto& packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver();
|
auto& packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver();
|
||||||
|
const PacketReceiver::PacketTypeList octreePackets =
|
||||||
packetReceiver.registerDirectListenerForTypes({ PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase },
|
{ PacketType::OctreeStats, PacketType::EntityData, PacketType::EntityErase, PacketType::EntityQueryInitialResultsComplete };
|
||||||
this, "handleOctreePacket");
|
packetReceiver.registerDirectListenerForTypes(octreePackets, this, "handleOctreePacket");
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctreePacketProcessor::handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
void OctreePacketProcessor::handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
||||||
|
@ -111,8 +111,36 @@ void OctreePacketProcessor::processPacket(QSharedPointer<ReceivedMessage> messag
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case PacketType::EntityQueryInitialResultsComplete: {
|
||||||
|
// Read sequence #
|
||||||
|
OCTREE_PACKET_SEQUENCE completionNumber;
|
||||||
|
message->readPrimitive(&completionNumber);
|
||||||
|
_completionSequenceNumber = completionNumber;
|
||||||
|
_completionSequenceNumberValid = true;
|
||||||
|
} break;
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
} break;
|
} break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void OctreePacketProcessor::resetCompletionSequenceNumber() {
|
||||||
|
_completionSequenceNumber = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template<typename T> constexpr bool lessThanWraparound(int a, int b) {
|
||||||
|
static const int MAX_T_VALUE = std::numeric_limits<T>::max();
|
||||||
|
if (b < a) {
|
||||||
|
b += MAX_T_VALUE;
|
||||||
|
}
|
||||||
|
return (b - a) < (MAX_T_VALUE / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool OctreePacketProcessor::octreeSequenceIsComplete(int sequenceNumber) const {
|
||||||
|
const int completionSequenceNumber = _completionSequenceNumber;
|
||||||
|
return _completionSequenceNumberValid &&
|
||||||
|
!lessThanWraparound<OCTREE_PACKET_SEQUENCE>(completionSequenceNumber, sequenceNumber);
|
||||||
|
}
|
||||||
|
|
|
@ -22,13 +22,23 @@ class OctreePacketProcessor : public ReceivedPacketProcessor {
|
||||||
public:
|
public:
|
||||||
OctreePacketProcessor();
|
OctreePacketProcessor();
|
||||||
|
|
||||||
|
bool octreeSequenceIsComplete(int sequenceNumber) const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void packetVersionMismatch();
|
void packetVersionMismatch();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void resetCompletionSequenceNumber();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void processPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode) override;
|
virtual void processPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer sendingNode) override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
void handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool _completionSequenceNumberValid { false };
|
||||||
|
std::atomic<int> _completionSequenceNumber { 0 };
|
||||||
|
|
||||||
};
|
};
|
||||||
#endif // hifi_OctreePacketProcessor_h
|
#endif // hifi_OctreePacketProcessor_h
|
||||||
|
|
|
@ -192,6 +192,8 @@ void OctreeProcessor::processDatagram(ReceivedMessage& message, SharedNodePointe
|
||||||
_elementsInLastWindow = 0;
|
_elementsInLastWindow = 0;
|
||||||
_entitiesInLastWindow = 0;
|
_entitiesInLastWindow = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_lastOctreeMessageSequence = sequence;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,8 @@ public:
|
||||||
float getAverageUncompressPerPacket() const { return _uncompressPerPacket.getAverage(); }
|
float getAverageUncompressPerPacket() const { return _uncompressPerPacket.getAverage(); }
|
||||||
float getAverageReadBitstreamPerPacket() const { return _readBitstreamPerPacket.getAverage(); }
|
float getAverageReadBitstreamPerPacket() const { return _readBitstreamPerPacket.getAverage(); }
|
||||||
|
|
||||||
|
OCTREE_PACKET_SEQUENCE getLastOctreeMessageSequence() const { return _lastOctreeMessageSequence; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual OctreePointer createTree() = 0;
|
virtual OctreePointer createTree() = 0;
|
||||||
|
|
||||||
|
@ -77,6 +79,7 @@ protected:
|
||||||
int _packetsInLastWindow = 0;
|
int _packetsInLastWindow = 0;
|
||||||
int _elementsInLastWindow = 0;
|
int _elementsInLastWindow = 0;
|
||||||
int _entitiesInLastWindow = 0;
|
int _entitiesInLastWindow = 0;
|
||||||
|
std::atomic<OCTREE_PACKET_SEQUENCE> _lastOctreeMessageSequence = 0;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue