mirror of
https://github.com/overte-org/overte.git
synced 2025-04-20 03:44:02 +02:00
packet recovery seems to be working
Seems to impact FPS a lot. OctreeSceneStats is not being locked (causes freezing, need to find out why).
This commit is contained in:
parent
d21a8e73ff
commit
b39559d860
7 changed files with 37 additions and 33 deletions
|
@ -377,11 +377,6 @@ void OctreeQueryNode::packetSent(const QByteArray& packet) {
|
|||
_sequenceNumber++;
|
||||
}
|
||||
|
||||
|
||||
void OctreeQueryNode::addSequenceNumbersToResend(const QList<OCTREE_PACKET_SEQUENCE>& sequenceNumbers) {
|
||||
_nackedSequenceNumbers.append(sequenceNumbers);
|
||||
}
|
||||
|
||||
bool OctreeQueryNode::hasNextNackedPacket() const {
|
||||
return !_nackedSequenceNumbers.isEmpty();
|
||||
}
|
||||
|
|
|
@ -109,7 +109,9 @@ public:
|
|||
|
||||
OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; }
|
||||
|
||||
void addSequenceNumbersToResend(const QList<OCTREE_PACKET_SEQUENCE>& sequenceNumbers);
|
||||
void addNackedSequenceNumber(OCTREE_PACKET_SEQUENCE sequenceNumber) {
|
||||
_nackedSequenceNumbers.append(sequenceNumber);
|
||||
}
|
||||
bool hasNextNackedPacket() const;
|
||||
const QByteArray* getNextNackedPacket();
|
||||
|
||||
|
|
|
@ -305,7 +305,8 @@ int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
|
|||
_totalWastedBytes += MAX_PACKET_SIZE - packet->size(); // ???
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (packetsSent > 0)
|
||||
printf("\t\t re-sent %d packets!\n", packetsSent);
|
||||
return packetsSent;
|
||||
}
|
||||
|
|
|
@ -832,10 +832,9 @@ void OctreeServer::readPendingDatagrams() {
|
|||
PacketType packetType = packetTypeForPacket(receivedPacket);
|
||||
SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket);
|
||||
if (packetType == getMyQueryMessageType()) {
|
||||
|
||||
// If we got a query packet, then we're talking to an agent, and we
|
||||
// need to make sure we have it in our nodeList.
|
||||
if (matchingNode) {
|
||||
if (matchingNode) {
|
||||
nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket);
|
||||
OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData();
|
||||
if (nodeData && !nodeData->isOctreeSendThreadInitalized()) {
|
||||
|
@ -852,25 +851,29 @@ void OctreeServer::readPendingDatagrams() {
|
|||
} else if (packetType == PacketTypeOctreeDataNack) {
|
||||
|
||||
// parse packet for sequence numbers that need to be resent
|
||||
int numBytesPacketHeader = numBytesForPacketHeader(receivedPacket);
|
||||
const unsigned char* dataAt = reinterpret_cast<const unsigned char*>(receivedPacket.data()) + numBytesPacketHeader;
|
||||
|
||||
uint16_t numSequenceNumbers = (*(uint16_t*)dataAt);
|
||||
dataAt += sizeof(uint16_t);
|
||||
if (matchingNode) {
|
||||
|
||||
// read sequence numbers
|
||||
QList<OCTREE_PACKET_SEQUENCE> sequenceNumbers;
|
||||
for (int i = 0; i < numSequenceNumbers; i++) {
|
||||
OCTREE_PACKET_SEQUENCE sequenceNumber = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
|
||||
sequenceNumbers.append(sequenceNumber);
|
||||
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
|
||||
OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData();
|
||||
|
||||
printf("\t\t\t nacked packet: seq = %d\n", sequenceNumber);
|
||||
int numBytesPacketHeader = numBytesForPacketHeader(receivedPacket);
|
||||
const unsigned char* dataAt = reinterpret_cast<const unsigned char*>(receivedPacket.data()) + numBytesPacketHeader;
|
||||
|
||||
uint16_t numSequenceNumbers = (*(uint16_t*)dataAt);
|
||||
dataAt += sizeof(uint16_t);
|
||||
|
||||
printf("\t received nack packet containing %d seq nums\n", numSequenceNumbers);
|
||||
|
||||
// read sequence numbers
|
||||
for (int i = 0; i < numSequenceNumbers; i++) {
|
||||
OCTREE_PACKET_SEQUENCE sequenceNumber = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
|
||||
nodeData->addNackedSequenceNumber(sequenceNumber);
|
||||
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
|
||||
|
||||
printf("\t seq = %d\n", sequenceNumber);
|
||||
}
|
||||
}
|
||||
|
||||
OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); // move this or something
|
||||
nodeData->addSequenceNumbersToResend(sequenceNumbers);
|
||||
|
||||
|
||||
|
||||
} else if (packetType == PacketTypeJurisdictionRequest) {
|
||||
|
|
|
@ -2110,8 +2110,6 @@ void Application::updateMyAvatar(float deltaTime) {
|
|||
|
||||
void Application::sendNack() {
|
||||
|
||||
printf("\n\t sendNack()...\n");
|
||||
|
||||
char packet[MAX_PACKET_SIZE];
|
||||
NodeList* nodeList = NodeList::getInstance();
|
||||
|
||||
|
@ -2124,15 +2122,18 @@ printf("\n\t sendNack()...\n");
|
|||
|| node->getType() == NodeType::ModelServer)
|
||||
) {
|
||||
|
||||
_octreeSceneStatsLock.lockForWrite();
|
||||
//_octreeSceneStatsLock.lockForWrite();
|
||||
|
||||
OctreeSceneStats& stats = _octreeServerSceneStats[node->getUUID()];
|
||||
int numSequenceNumbersAvailable = stats.getNumSequenceNumbersToNack();
|
||||
if (numSequenceNumbersAvailable == 0)
|
||||
continue;
|
||||
|
||||
char* dataAt = packet;
|
||||
int bytesRemaining = MAX_PACKET_SIZE;
|
||||
|
||||
// pack header
|
||||
int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeDataNack, node->getUUID());
|
||||
int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeDataNack);
|
||||
dataAt += numBytesPacketHeader;
|
||||
bytesRemaining -= numBytesPacketHeader;
|
||||
|
||||
|
@ -2140,12 +2141,13 @@ printf("\n\t sendNack()...\n");
|
|||
|
||||
|
||||
// calculate and pack number of sequence numbers
|
||||
uint16_t numSequenceNumbers = min(stats.getNumSequenceNumbersToNack(), numPacketsRoomFor);
|
||||
uint16_t numSequenceNumbers = min(numSequenceNumbersAvailable, numPacketsRoomFor);
|
||||
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;
|
||||
|
@ -2155,10 +2157,10 @@ printf(" %d,", *sequenceNumberAt);
|
|||
}
|
||||
printf("\n");
|
||||
|
||||
_octreeSceneStatsLock.unlock();
|
||||
//_octreeSceneStatsLock.unlock();
|
||||
|
||||
// make sure we still have an active socket????
|
||||
nodeList->writeUnverifiedDatagram(packet, dataAt - packet, node);
|
||||
nodeList->writeUnverifiedDatagram(packet, dataAt-packet, node);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -274,13 +274,13 @@ qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const Share
|
|||
qint64 LimitedNodeList::writeDatagram2(int seq, const char* data, qint64 size, const SharedNodePointer& destinationNode,
|
||||
const HifiSockAddr& overridenSockAddr) {
|
||||
|
||||
qint64 ret;
|
||||
qint64 ret = -1;
|
||||
|
||||
if (randFloat() < 0.8f) {
|
||||
ret = writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr);
|
||||
}
|
||||
else {
|
||||
printf("\t\t\t dropped packet seq = %d!!!\n", seq);
|
||||
printf("dropped packet seq = %d --------------------------\n", seq);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -75,7 +75,8 @@ const QSet<PacketType> NON_VERIFIED_PACKETS = QSet<PacketType>()
|
|||
<< PacketTypeDomainServerRequireDTLS << PacketTypeDomainConnectRequest
|
||||
<< PacketTypeDomainList << PacketTypeDomainListRequest << PacketTypeDomainOAuthRequest
|
||||
<< PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse
|
||||
<< PacketTypeNodeJsonStats << PacketTypeVoxelQuery << PacketTypeParticleQuery << PacketTypeModelQuery;
|
||||
<< PacketTypeNodeJsonStats << PacketTypeVoxelQuery << PacketTypeParticleQuery << PacketTypeModelQuery
|
||||
<< PacketTypeOctreeDataNack;
|
||||
|
||||
const int NUM_BYTES_MD5_HASH = 16;
|
||||
const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID;
|
||||
|
|
Loading…
Reference in a new issue