mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-25 18:55:01 +02:00
added code for AC to send nack packets; no locking yet
This commit is contained in:
parent
7955979599
commit
15bd0878c4
6 changed files with 79 additions and 2 deletions
|
@ -212,4 +212,4 @@ void SingleSenderStats::trackInboundPacket(unsigned short int incomingSequence,
|
|||
_totalLockWaitTime += lockWaitTime;
|
||||
_totalElementsInPacket += editsInPacket;
|
||||
_totalPackets++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -35,6 +35,7 @@ public:
|
|||
|
||||
void trackInboundPacket(unsigned short int incomingSequence, quint64 transitTime,
|
||||
int editsInPacket, quint64 processTime, quint64 lockWaitTime);
|
||||
const QSet<unsigned short int>& getMissingSequenceNumbers() const { return _missingSequenceNumbers; }
|
||||
|
||||
|
||||
quint64 _totalTransitTime;
|
||||
|
@ -71,6 +72,7 @@ public:
|
|||
void resetStats();
|
||||
|
||||
NodeToSenderStatsMap& getSingleSenderStats() { return _singleSenderStats; }
|
||||
const NodeToSenderStatsMap& getSingleSenderStats() const { return _singleSenderStats; }
|
||||
|
||||
protected:
|
||||
virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet);
|
||||
|
|
|
@ -85,6 +85,7 @@ bool OctreeSendThread::process() {
|
|||
if (nodeData && !nodeData->isShuttingDown()) {
|
||||
bool viewFrustumChanged = nodeData->updateCurrentViewFrustum();
|
||||
packetDistributor(nodeData, viewFrustumChanged);
|
||||
sendNack(nodeData);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -111,6 +112,75 @@ bool OctreeSendThread::process() {
|
|||
return isStillRunning(); // keep running till they terminate us
|
||||
}
|
||||
|
||||
|
||||
int OctreeSendThread::sendNack(OctreeQueryNode* nodeData) {
|
||||
|
||||
// if we're shutting down, then exit early
|
||||
if (nodeData->isShuttingDown()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
const OctreeInboundPacketProcessor* myServerPacketProcessor = _myServer->getInboundPacketProcessor();
|
||||
|
||||
// if there are packets from _node that are waiting to be processed,
|
||||
// don't send a NACK since the missing packets may be among those waiting packets.
|
||||
if (myServerPacketProcessor->hasPacketsToProcessFrom(_node)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// lock unlock required ????????? prolly: _singleSenderStats may have our node's entry deleted during this or something
|
||||
// maybe just make a copy instead!!
|
||||
|
||||
// lock
|
||||
|
||||
const QSet<unsigned short int> missingSequenceNumbersFromNode = myServerPacketProcessor
|
||||
->getSingleSenderStats().at(_node->getUUID()).getMissingSequenceNumbers();
|
||||
|
||||
// check if there are any sequence numbers that need to be nacked
|
||||
int numSequenceNumbersAvailable = missingSequenceNumbersFromNode.size();
|
||||
if (numSequenceNumbersAvailable == 0) {
|
||||
//unlock
|
||||
return 0;
|
||||
}
|
||||
|
||||
// construct nack packet
|
||||
|
||||
char packet[MAX_PACKET_SIZE];
|
||||
|
||||
char* dataAt = packet;
|
||||
int bytesRemaining = MAX_PACKET_SIZE;
|
||||
|
||||
// pack header
|
||||
int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeEditNack);
|
||||
dataAt += numBytesPacketHeader;
|
||||
bytesRemaining -= numBytesPacketHeader;
|
||||
int numSequenceNumbersRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(unsigned short int);
|
||||
|
||||
// calculate and pack the number of sequence numbers
|
||||
uint16_t numSequenceNumbers = std::min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor);
|
||||
uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt;
|
||||
*numSequenceNumbersAt = numSequenceNumbers;
|
||||
dataAt += sizeof(uint16_t);
|
||||
|
||||
// pack sequence numbers
|
||||
QSet<unsigned short int>::const_iterator begin = missingSequenceNumbersFromNode.begin(), end = missingSequenceNumbersFromNode.end();
|
||||
for (QSet<unsigned short int>::const_iterator i = begin; i != end; i++) {
|
||||
unsigned short int* sequenceNumberAt = (unsigned short int*)dataAt;
|
||||
*sequenceNumberAt = *i;
|
||||
dataAt += sizeof(unsigned short int);
|
||||
}
|
||||
|
||||
// send it
|
||||
OctreeServer::didCallWriteDatagram(this);
|
||||
NodeList::getInstance()->writeDatagram((char*)packet, dataAt - packet, _node);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
quint64 OctreeSendThread::_usleepTime = 0;
|
||||
quint64 OctreeSendThread::_usleepCalls = 0;
|
||||
|
||||
|
|
|
@ -50,6 +50,8 @@ private:
|
|||
|
||||
int handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent);
|
||||
int packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged);
|
||||
|
||||
int sendNack(OctreeQueryNode* nodeData);
|
||||
|
||||
OctreePacketData _packetData;
|
||||
|
||||
|
|
|
@ -51,6 +51,8 @@ public:
|
|||
int getPacketsPerClientPerSecond() const { return getPacketsPerClientPerInterval() * INTERVALS_PER_SECOND; }
|
||||
int getPacketsTotalPerInterval() const { return _packetsTotalPerInterval; }
|
||||
int getPacketsTotalPerSecond() const { return getPacketsTotalPerInterval() * INTERVALS_PER_SECOND; }
|
||||
|
||||
const OctreeInboundPacketProcessor* getInboundPacketProcessor() const { return _octreeInboundPacketProcessor; }
|
||||
|
||||
static int getCurrentClientCount() { return _clientCount; }
|
||||
static void clientConnected() { _clientCount++; }
|
||||
|
|
|
@ -66,7 +66,8 @@ enum PacketType {
|
|||
PacketTypeModelAddOrEdit,
|
||||
PacketTypeModelErase,
|
||||
PacketTypeModelAddResponse,
|
||||
PacketTypeOctreeDataNack
|
||||
PacketTypeOctreeDataNack,
|
||||
PacketTypeOctreeEditNack,
|
||||
};
|
||||
|
||||
typedef char PacketVersion;
|
||||
|
|
Loading…
Reference in a new issue