mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 18:50:00 +02:00
added octree scene stats locking and unlocking
This commit is contained in:
parent
5286090812
commit
3bc457d4d2
4 changed files with 49 additions and 35 deletions
|
@ -382,11 +382,9 @@ bool OctreeQueryNode::hasNextNackedPacket() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
const QByteArray* OctreeQueryNode::getNextNackedPacket() {
|
const QByteArray* OctreeQueryNode::getNextNackedPacket() {
|
||||||
|
|
||||||
if (!_nackedSequenceNumbers.isEmpty()) {
|
if (!_nackedSequenceNumbers.isEmpty()) {
|
||||||
const QByteArray* nextPacket = _sentPacketHistory.getPacket(_nackedSequenceNumbers.first());
|
// could return null if packet is not in the history
|
||||||
_nackedSequenceNumbers.pop_front();
|
return _sentPacketHistory.getPacket(_nackedSequenceNumbers.takeFirst());
|
||||||
return nextPacket; // could be null
|
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -288,18 +288,15 @@ NodeList::getInstance()->writeDatagram2(nodeData->getSequenceNumber(), (char*)no
|
||||||
int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
|
int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
|
||||||
|
|
||||||
const int MAX_PACKETS_RESEND = 10;
|
const int MAX_PACKETS_RESEND = 10;
|
||||||
|
|
||||||
int packetsSent = 0;
|
int packetsSent = 0;
|
||||||
|
|
||||||
const QByteArray* packet;
|
const QByteArray* packet;
|
||||||
while (nodeData->hasNextNackedPacket() && packetsSent < MAX_PACKETS_RESEND) {
|
while (nodeData->hasNextNackedPacket() && packetsSent < MAX_PACKETS_RESEND) {
|
||||||
packet = nodeData->getNextNackedPacket();
|
packet = nodeData->getNextNackedPacket();
|
||||||
// packet will be NULL if it's not in nodeData's packet history
|
|
||||||
if (packet) {
|
if (packet) {
|
||||||
NodeList::getInstance()->writeDatagram(*packet, _node);
|
NodeList::getInstance()->writeDatagram(*packet, _node);
|
||||||
packetsSent++;
|
packetsSent++;
|
||||||
|
|
||||||
// ??????
|
|
||||||
_totalBytes += packet->size();
|
_totalBytes += packet->size();
|
||||||
_totalPackets++;
|
_totalPackets++;
|
||||||
_totalWastedBytes += MAX_PACKET_SIZE - packet->size(); // ???
|
_totalWastedBytes += MAX_PACKET_SIZE - packet->size(); // ???
|
||||||
|
|
|
@ -2107,6 +2107,21 @@ void Application::updateMyAvatar(float deltaTime) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*/ Attempt to identify the sender from it's address.
|
||||||
|
if (sendingNode) {
|
||||||
|
QUuid nodeUUID = sendingNode->getUUID();
|
||||||
|
|
||||||
|
// now that we know the node ID, let's add these stats to the stats for that node...
|
||||||
|
_octreeSceneStatsLock.lockForWrite();
|
||||||
|
if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) {
|
||||||
|
OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID];
|
||||||
|
stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec());
|
||||||
|
}
|
||||||
|
_octreeSceneStatsLock.unlock();
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Application::sendNack() {
|
void Application::sendNack() {
|
||||||
|
|
||||||
|
@ -2122,13 +2137,6 @@ void Application::sendNack() {
|
||||||
|| node->getType() == NodeType::ModelServer)
|
|| node->getType() == NodeType::ModelServer)
|
||||||
) {
|
) {
|
||||||
|
|
||||||
//_octreeSceneStatsLock.lockForWrite();
|
|
||||||
|
|
||||||
OctreeSceneStats& stats = _octreeServerSceneStats[node->getUUID()];
|
|
||||||
int numSequenceNumbersAvailable = stats.getNumSequenceNumbersToNack();
|
|
||||||
if (numSequenceNumbersAvailable == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
char* dataAt = packet;
|
char* dataAt = packet;
|
||||||
int bytesRemaining = MAX_PACKET_SIZE;
|
int bytesRemaining = MAX_PACKET_SIZE;
|
||||||
|
|
||||||
|
@ -2136,28 +2144,39 @@ void Application::sendNack() {
|
||||||
int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeDataNack);
|
int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeDataNack);
|
||||||
dataAt += numBytesPacketHeader;
|
dataAt += numBytesPacketHeader;
|
||||||
bytesRemaining -= numBytesPacketHeader;
|
bytesRemaining -= numBytesPacketHeader;
|
||||||
|
int numSequenceNumbersRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(OCTREE_PACKET_SEQUENCE);
|
||||||
int numPacketsRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(OCTREE_PACKET_SEQUENCE);
|
|
||||||
|
|
||||||
|
|
||||||
// calculate and pack number of sequence numbers
|
QUuid nodeUUID = node->getUUID();
|
||||||
uint16_t numSequenceNumbers = min(numSequenceNumbersAvailable, numPacketsRoomFor);
|
|
||||||
uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt;
|
|
||||||
*numSequenceNumbersAt = numSequenceNumbers;
|
|
||||||
dataAt += sizeof(uint16_t);
|
|
||||||
|
|
||||||
// pack sequence numbers
|
_octreeSceneStatsLock.lockForWrite();
|
||||||
//printf("\n\t sending nack...\n");
|
if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) {
|
||||||
//printf("\t\t packed %d seq #s:", numSequenceNumbers);
|
OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID];
|
||||||
for (int i = 0; i < numSequenceNumbers; i++) {
|
|
||||||
OCTREE_PACKET_SEQUENCE* sequenceNumberAt = (OCTREE_PACKET_SEQUENCE*)dataAt;
|
int numSequenceNumbersAvailable = stats.getNumSequenceNumbersToNack();
|
||||||
*sequenceNumberAt = stats.getNextSequenceNumberToNack();
|
if (numSequenceNumbersAvailable == 0) {
|
||||||
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
|
_octreeSceneStatsLock.unlock();
|
||||||
//printf(" %d,", *sequenceNumberAt);
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// calculate and pack number of sequence numbers
|
||||||
|
uint16_t numSequenceNumbers = min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor);
|
||||||
|
uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt;
|
||||||
|
*numSequenceNumbersAt = numSequenceNumbers;
|
||||||
|
dataAt += sizeof(uint16_t);
|
||||||
|
|
||||||
|
// pack sequence numbers
|
||||||
|
//printf("\n\t sending nack...\n");
|
||||||
|
//printf("\t\t packed %d seq #s:", numSequenceNumbers);
|
||||||
|
for (int i = 0; i < numSequenceNumbers; i++) {
|
||||||
|
OCTREE_PACKET_SEQUENCE* sequenceNumberAt = (OCTREE_PACKET_SEQUENCE*)dataAt;
|
||||||
|
*sequenceNumberAt = stats.getNextSequenceNumberToNack();
|
||||||
|
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
|
||||||
|
//printf(" %d,", *sequenceNumberAt);
|
||||||
|
}
|
||||||
|
//printf("\n");
|
||||||
}
|
}
|
||||||
//printf("\n");
|
_octreeSceneStatsLock.unlock();
|
||||||
|
|
||||||
//_octreeSceneStatsLock.unlock();
|
|
||||||
|
|
||||||
// make sure we still have an active socket????
|
// make sure we still have an active socket????
|
||||||
nodeList->writeUnverifiedDatagram(packet, dataAt-packet, node);
|
nodeList->writeUnverifiedDatagram(packet, dataAt-packet, node);
|
||||||
|
|
|
@ -275,8 +275,8 @@ private:
|
||||||
quint32 _incomingLate; /// out of order later than expected
|
quint32 _incomingLate; /// out of order later than expected
|
||||||
quint32 _incomingReallyLate; /// out of order and later than MAX_MISSING_SEQUENCE_OLD_AGE late
|
quint32 _incomingReallyLate; /// out of order and later than MAX_MISSING_SEQUENCE_OLD_AGE late
|
||||||
quint32 _incomingPossibleDuplicate; /// out of order possibly a duplicate
|
quint32 _incomingPossibleDuplicate; /// out of order possibly a duplicate
|
||||||
QSet<uint16_t> _missingSequenceNumbers;
|
QSet<OCTREE_PACKET_SEQUENCE> _missingSequenceNumbers;
|
||||||
QSet<uint16_t> _sequenceNumbersToNack;
|
QSet<OCTREE_PACKET_SEQUENCE> _sequenceNumbersToNack;
|
||||||
SimpleMovingAverage _incomingFlightTimeAverage;
|
SimpleMovingAverage _incomingFlightTimeAverage;
|
||||||
|
|
||||||
// features related items
|
// features related items
|
||||||
|
|
Loading…
Reference in a new issue