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

View file

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

View file

@ -85,6 +85,7 @@ bool OctreeSendThread::process() {
if (nodeData && !nodeData->isShuttingDown()) { if (nodeData && !nodeData->isShuttingDown()) {
bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); bool viewFrustumChanged = nodeData->updateCurrentViewFrustum();
packetDistributor(nodeData, viewFrustumChanged); packetDistributor(nodeData, viewFrustumChanged);
resendNackedPackets(nodeData);
} }
} }
} }
@ -274,7 +275,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
trueBytesSent += nodeData->getPacketLength(); trueBytesSent += nodeData->getPacketLength();
truePacketsSent++; truePacketsSent++;
packetsSent++; packetsSent++;
nodeData->packetSent(); nodeData->octreePacketSent();
nodeData->resetOctreePacket(); nodeData->resetOctreePacket();
} }
@ -287,11 +288,14 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) { int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
const int maxPacketsSent = 10;
int packetsSent = 0; int packetsSent = 0;
const QByteArray* packet; const QByteArray* packet;
while (nodeData->hasNextPacketToResend()) { while (nodeData->hasNextNackedPacket() && packetsSent < maxPacketsSent) {
packet = nodeData->getNextPacketToResend(); 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++;
@ -302,7 +306,9 @@ int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
_totalWastedBytes += MAX_PACKET_SIZE - packet->size(); // ??? _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 /// Version of voxel distributor that sends the deepest LOD level at once
int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged) { int OctreeSendThread::packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged) {

View file

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