completed code to resend nacked packets on AC

This commit is contained in:
wangyix 2014-06-06 09:33:14 -07:00
parent 1a7e3a859c
commit 5461a06e99
4 changed files with 26 additions and 22 deletions

View file

@ -364,7 +364,7 @@ void OctreeQueryNode::dumpOutOfView() {
}
}
void OctreeQueryNode::packetSent() {
void OctreeQueryNode::octreePacketSent() {
packetSent(_octreePacket, getPacketLength());
}
@ -379,18 +379,18 @@ void OctreeQueryNode::packetSent(const QByteArray& packet) {
void OctreeQueryNode::addSequenceNumbersToResend(const QList<OCTREE_PACKET_SEQUENCE>& sequenceNumbers) {
_sequenceNumbersToResend.append(sequenceNumbers);
_nackedSequenceNumbers.append(sequenceNumbers);
}
bool OctreeQueryNode::hasNextPacketToResend() const {
return !_sequenceNumbersToResend.isEmpty();
bool OctreeQueryNode::hasNextNackedPacket() const {
return !_nackedSequenceNumbers.isEmpty();
}
const QByteArray* OctreeQueryNode::getNextPacketToResend() {
const QByteArray* OctreeQueryNode::getNextNackedPacket() {
if (!_sequenceNumbersToResend.isEmpty()) {
const QByteArray* nextPacket = _sentPacketHistory.getPacket(_sequenceNumbersToResend.first());
_sequenceNumbersToResend.pop_front();
if (!_nackedSequenceNumbers.isEmpty()) {
const QByteArray* nextPacket = _sentPacketHistory.getPacket(_nackedSequenceNumbers.first());
_nackedSequenceNumbers.pop_front();
return nextPacket; // could be null
}
return NULL;

View file

@ -103,15 +103,15 @@ public:
void forceNodeShutdown();
bool isShuttingDown() const { return _isShuttingDown; }
void packetSent();
void octreePacketSent();
void packetSent(unsigned char* packet, int packetLength);
void packetSent(const QByteArray& packet);
OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; }
void addSequenceNumbersToResend(const QList<OCTREE_PACKET_SEQUENCE>& sequenceNumbers);
bool hasNextPacketToResend() const;
const QByteArray* getNextPacketToResend();
bool hasNextNackedPacket() const;
const QByteArray* getNextNackedPacket();
private slots:
void sendThreadFinished();
@ -157,7 +157,7 @@ private:
bool _isShuttingDown;
SentPacketHistory _sentPacketHistory;
QQueue<OCTREE_PACKET_SEQUENCE> _sequenceNumbersToResend;
QQueue<OCTREE_PACKET_SEQUENCE> _nackedSequenceNumbers;
};
#endif // hifi_OctreeQueryNode_h

View file

@ -85,6 +85,7 @@ bool OctreeSendThread::process() {
if (nodeData && !nodeData->isShuttingDown()) {
bool viewFrustumChanged = nodeData->updateCurrentViewFrustum();
packetDistributor(nodeData, viewFrustumChanged);
resendNackedPackets(nodeData);
}
}
}
@ -274,7 +275,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
trueBytesSent += nodeData->getPacketLength();
truePacketsSent++;
packetsSent++;
nodeData->packetSent();
nodeData->octreePacketSent();
nodeData->resetOctreePacket();
}
@ -287,11 +288,14 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
const int maxPacketsSent = 10;
int packetsSent = 0;
const QByteArray* packet;
while (nodeData->hasNextPacketToResend()) {
packet = nodeData->getNextPacketToResend();
while (nodeData->hasNextNackedPacket() && packetsSent < maxPacketsSent) {
packet = nodeData->getNextNackedPacket();
// packet will be NULL if it's not in nodeData's packet history
if (packet) {
NodeList::getInstance()->writeDatagram(*packet, _node);
packetsSent++;
@ -302,7 +306,9 @@ int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
_totalWastedBytes += MAX_PACKET_SIZE - packet->size(); // ???
}
}
printf("\t\t re-sent %d packets!\n", packetsSent);
return packetsSent;
}
@ -310,11 +316,6 @@ int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
/// Version of voxel distributor that sends the deepest LOD level at once
int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged) {

View file

@ -861,8 +861,11 @@ dataAt += sizeof(uint16_t);
// read sequence numbers
QList<OCTREE_PACKET_SEQUENCE> sequenceNumbers;
for (int i = 0; i < numSequenceNumbers; i++) {
sequenceNumbers.append(*(OCTREE_PACKET_SEQUENCE*)dataAt);
OCTREE_PACKET_SEQUENCE sequenceNumber = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
sequenceNumbers.append(sequenceNumber);
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
printf("\t\t\t nacked packet: seq = %d\n", sequenceNumber);
}
OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); // move this or something