mirror of
https://github.com/overte-org/overte.git
synced 2025-04-14 03:07:05 +02:00
handle stats + data packet combination in OctreeSendThread
This commit is contained in:
parent
01b1c46237
commit
e953b36f58
3 changed files with 146 additions and 184 deletions
|
@ -144,111 +144,84 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
|
|||
// If we've got a stats message ready to send, then see if we can piggyback them together
|
||||
if (nodeData->stats.isReadyToSend() && !nodeData->isShuttingDown()) {
|
||||
// Send the stats message to the client
|
||||
unsigned char* statsMessage = nodeData->stats.getStatsMessage();
|
||||
int statsMessageLength = nodeData->stats.getStatsMessageLength();
|
||||
int piggyBackSize = nodeData->getPacketLength() + statsMessageLength;
|
||||
NLPacket& statsPacket = nodeData->stats.getStatsMessage();
|
||||
|
||||
// If the size of the stats message and the octree message will fit in a packet, then piggyback them
|
||||
if (piggyBackSize < MAX_PACKET_SIZE) {
|
||||
if (nodeData->getPacket()->getSizeUsed() < statsPacket->bytesAvailable()) {
|
||||
|
||||
// copy octree message to back of stats message
|
||||
memcpy(statsMessage + statsMessageLength, nodeData->getPacket(), nodeData->getPacketLength());
|
||||
statsMessageLength += nodeData->getPacketLength();
|
||||
statsPacket->write(nodeData->getPacket()->getData(), nodeData->getPacket()->getSizeWithHeader());
|
||||
|
||||
// since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since
|
||||
// there was nothing else to send.
|
||||
int thisWastedBytes = 0;
|
||||
_totalWastedBytes += thisWastedBytes;
|
||||
_totalBytes += nodeData->getPacketLength();
|
||||
_totalBytes += statsPacket->getSizeWithHeader();
|
||||
_totalPackets++;
|
||||
|
||||
if (debug) {
|
||||
const unsigned char* messageData = nodeData->getPacket();
|
||||
int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast<const char*>(messageData));
|
||||
const unsigned char* dataAt = messageData + numBytesPacketHeader;
|
||||
dataAt += sizeof(OCTREE_PACKET_FLAGS);
|
||||
OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
|
||||
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
|
||||
OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt);
|
||||
dataAt += sizeof(OCTREE_PACKET_SENT_TIME);
|
||||
NLPacket& sentPacket = nodeData->getPacket();
|
||||
|
||||
sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS));
|
||||
|
||||
OCTREE_PACKET_SEQUENCE sequence;
|
||||
sentPacket->read(&sequence, sizeof(sequence));
|
||||
|
||||
OCTREE_PACKET_SENT_TIME timestamp;
|
||||
sentPacket->read(×tamp, sizeof(timestamp));
|
||||
|
||||
qDebug() << "Adding stats to packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence <<
|
||||
" timestamp: " << timestamp <<
|
||||
" statsMessageLength: " << statsMessageLength <<
|
||||
" original size: " << nodeData->getPacketLength() << " [" << _totalBytes <<
|
||||
" statsMessageLength: " << statsPacket->getSizeWithHeader() <<
|
||||
" original size: " << nodeData->getPacket()->getSizeWithHeader() << " [" << _totalBytes <<
|
||||
"] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]";
|
||||
}
|
||||
|
||||
// actually send it
|
||||
OctreeServer::didCallWriteDatagram(this);
|
||||
DependencyManager::get<NodeList>()->writeDatagram((char*) statsMessage, statsMessageLength, _node);
|
||||
DependencyManager::get<NodeList>()->sendUnreliablePacket(statsPacket, _node);
|
||||
packetSent = true;
|
||||
} else {
|
||||
// not enough room in the packet, send two packets
|
||||
OctreeServer::didCallWriteDatagram(this);
|
||||
DependencyManager::get<NodeList>()->writeDatagram((char*) statsMessage, statsMessageLength, _node);
|
||||
DependencyManager::get<NodeList>()-sendUnreliablePacket(statsPacket, _node);
|
||||
|
||||
// since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since
|
||||
// there was nothing else to send.
|
||||
int thisWastedBytes = 0;
|
||||
_totalWastedBytes += thisWastedBytes;
|
||||
_totalBytes += statsMessageLength;
|
||||
_totalBytes += statsPacket->getSizeWithHeader();
|
||||
_totalPackets++;
|
||||
|
||||
if (debug) {
|
||||
const unsigned char* messageData = nodeData->getPacket();
|
||||
int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast<const char*>(messageData));
|
||||
const unsigned char* dataAt = messageData + numBytesPacketHeader;
|
||||
dataAt += sizeof(OCTREE_PACKET_FLAGS);
|
||||
OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
|
||||
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
|
||||
OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt);
|
||||
dataAt += sizeof(OCTREE_PACKET_SENT_TIME);
|
||||
NLPacket& sentPacket = nodeData->getPacket();
|
||||
|
||||
sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS));
|
||||
|
||||
OCTREE_PACKET_SEQUENCE sequence;
|
||||
sentPacket->read(&sequence, sizeof(sequence));
|
||||
|
||||
OCTREE_PACKET_SENT_TIME timestamp;
|
||||
sentPacket->read(×tamp, sizeof(timestamp));
|
||||
|
||||
qDebug() << "Sending separate stats packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence <<
|
||||
" timestamp: " << timestamp <<
|
||||
" size: " << statsMessageLength << " [" << _totalBytes <<
|
||||
" size: " << statsPacket->getSizeWithHeader() << " [" << _totalBytes <<
|
||||
"] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]";
|
||||
}
|
||||
|
||||
trueBytesSent += statsMessageLength;
|
||||
trueBytesSent += statsPacket->getSizeWithHeader();
|
||||
truePacketsSent++;
|
||||
packetsSent++;
|
||||
|
||||
OctreeServer::didCallWriteDatagram(this);
|
||||
DependencyManager::get<NodeList>()->writeDatagram((char*)nodeData->getPacket(), nodeData->getPacketLength(), _node);
|
||||
packetSent = true;
|
||||
|
||||
thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength();
|
||||
_totalWastedBytes += thisWastedBytes;
|
||||
_totalBytes += nodeData->getPacketLength();
|
||||
_totalPackets++;
|
||||
if (debug) {
|
||||
const unsigned char* messageData = nodeData->getPacket();
|
||||
int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast<const char*>(messageData));
|
||||
const unsigned char* dataAt = messageData + numBytesPacketHeader;
|
||||
dataAt += sizeof(OCTREE_PACKET_FLAGS);
|
||||
OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
|
||||
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
|
||||
OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt);
|
||||
dataAt += sizeof(OCTREE_PACKET_SENT_TIME);
|
||||
|
||||
qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence <<
|
||||
" timestamp: " << timestamp <<
|
||||
" size: " << nodeData->getPacketLength() << " [" << _totalBytes <<
|
||||
"] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]";
|
||||
}
|
||||
}
|
||||
nodeData->stats.markAsSent();
|
||||
} else {
|
||||
// If there's actually a packet waiting, then send it.
|
||||
if (nodeData->isPacketWaiting() && !nodeData->isShuttingDown()) {
|
||||
// just send the octree packet
|
||||
OctreeServer::didCallWriteDatagram(this);
|
||||
DependencyManager::get<NodeList>()->sendUnreliablePacket(nodeData->getPacket(), _node);
|
||||
packetSent = true;
|
||||
|
||||
int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength();
|
||||
int packetSizeWithHeader = nodeData->getPacket()->getSizeWithHeader();
|
||||
thisWastedBytes = MAX_PACKET_SIZE - packetSizeWithHeader;
|
||||
_totalWastedBytes += thisWastedBytes;
|
||||
_totalBytes += nodeData->getPacketLength();
|
||||
_totalBytes += nodeData->getPacket()->getSizeWithHeader();
|
||||
_totalPackets++;
|
||||
|
||||
if (debug) {
|
||||
|
@ -264,7 +237,39 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
|
|||
|
||||
qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence <<
|
||||
" timestamp: " << timestamp <<
|
||||
" size: " << nodeData->getPacketLength() << " [" << _totalBytes <<
|
||||
" size: " << nodeData->getPacket()->getSizeWithHeader() << " [" << _totalBytes <<
|
||||
"] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]";
|
||||
}
|
||||
}
|
||||
nodeData->stats.markAsSent();
|
||||
} else {
|
||||
// If there's actually a packet waiting, then send it.
|
||||
if (nodeData->isPacketWaiting() && !nodeData->isShuttingDown()) {
|
||||
// just send the octree packet
|
||||
OctreeServer::didCallWriteDatagram(this);
|
||||
DependencyManager::get<NodeList>()->sendUnreliablePacket(nodeData->getPacket(), _node);
|
||||
packetSent = true;
|
||||
|
||||
int packetSizeWithHeader = nodeData->getPacket()->getSizeWithHeader();
|
||||
int thisWastedBytes = MAX_PACKET_SIZE -;
|
||||
_totalWastedBytes += thisWastedBytes;
|
||||
_totalBytes += packetSizeWithHeader;
|
||||
_totalPackets++;
|
||||
|
||||
if (debug) {
|
||||
NLPacket& sentPacket = nodeData->getPacket();
|
||||
|
||||
sentPacket->seek(sizeof(OCTREE_PACKET_FLAGS));
|
||||
|
||||
OCTREE_PACKET_SEQUENCE sequence;
|
||||
sentPacket->read(&sequence, sizeof(sequence));
|
||||
|
||||
OCTREE_PACKET_SENT_TIME timestamp;
|
||||
sentPacket->read(×tamp, sizeof(timestamp));
|
||||
|
||||
qDebug() << "Sending packet at " << now << " [" << _totalPackets <<"]: sequence: " << sequence <<
|
||||
" timestamp: " << timestamp <<
|
||||
" size: " << packetSizeWithHeader << " [" << _totalBytes <<
|
||||
"] wasted bytes:" << thisWastedBytes << " [" << _totalWastedBytes << "]";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,14 +24,13 @@
|
|||
|
||||
|
||||
const int samples = 100;
|
||||
OctreeSceneStats::OctreeSceneStats() :
|
||||
OctreeSceneStats::OctreeSceneStats() :
|
||||
_isReadyToSend(false),
|
||||
_isStarted(false),
|
||||
_lastFullElapsed(0),
|
||||
_lastFullTotalEncodeTime(0),
|
||||
_lastFullTotalPackets(0),
|
||||
_lastFullTotalBytes(0),
|
||||
|
||||
_elapsedAverage(samples),
|
||||
_bitsPerOctreeAverage(samples),
|
||||
_incomingPacket(0),
|
||||
|
@ -121,8 +120,8 @@ void OctreeSceneStats::copyFromOther(const OctreeSceneStats& other) {
|
|||
}
|
||||
}
|
||||
_jurisdictionEndNodes.clear();
|
||||
|
||||
// Now copy the values from the other
|
||||
|
||||
// Now copy the values from the other
|
||||
if (other._jurisdictionRoot) {
|
||||
int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(other._jurisdictionRoot));
|
||||
_jurisdictionRoot = new unsigned char[bytes];
|
||||
|
@ -154,14 +153,14 @@ void OctreeSceneStats::sceneStarted(bool isFullScene, bool isMoving, OctreeEleme
|
|||
reset(); // resets packet and octree stats
|
||||
_isStarted = true;
|
||||
_start = usecTimestampNow();
|
||||
|
||||
|
||||
_totalElements = OctreeElement::getNodeCount();
|
||||
_totalInternal = OctreeElement::getInternalNodeCount();
|
||||
_totalLeaves = OctreeElement::getLeafNodeCount();
|
||||
|
||||
|
||||
_isFullScene = isFullScene;
|
||||
_isMoving = isMoving;
|
||||
|
||||
|
||||
if (_jurisdictionRoot) {
|
||||
delete[] _jurisdictionRoot;
|
||||
_jurisdictionRoot = NULL;
|
||||
|
@ -201,13 +200,13 @@ void OctreeSceneStats::sceneCompleted() {
|
|||
_end = usecTimestampNow();
|
||||
_elapsed = _end - _start;
|
||||
_elapsedAverage.updateAverage((float)_elapsed);
|
||||
|
||||
|
||||
if (_isFullScene) {
|
||||
_lastFullElapsed = _elapsed;
|
||||
_lastFullTotalEncodeTime = _totalEncodeTime;
|
||||
}
|
||||
|
||||
_statsMessageLength = packIntoMessage(_statsMessage, sizeof(_statsMessage));
|
||||
packIntoPacket();
|
||||
_isReadyToSend = true;
|
||||
_isStarted = false;
|
||||
}
|
||||
|
@ -382,105 +381,65 @@ void OctreeSceneStats::childBitsRemoved(bool includesExistsBits, bool includesCo
|
|||
_treesRemoved++;
|
||||
}
|
||||
|
||||
int OctreeSceneStats::packIntoMessage(unsigned char* destinationBuffer, int availableBytes) {
|
||||
unsigned char* bufferStart = destinationBuffer;
|
||||
|
||||
int headerLength = DependencyManager::get<NodeList>()->populatePacketHeader(reinterpret_cast<char*>(destinationBuffer),
|
||||
PacketTypeOctreeStats);
|
||||
destinationBuffer += headerLength;
|
||||
|
||||
memcpy(destinationBuffer, &_start, sizeof(_start));
|
||||
destinationBuffer += sizeof(_start);
|
||||
memcpy(destinationBuffer, &_end, sizeof(_end));
|
||||
destinationBuffer += sizeof(_end);
|
||||
memcpy(destinationBuffer, &_elapsed, sizeof(_elapsed));
|
||||
destinationBuffer += sizeof(_elapsed);
|
||||
memcpy(destinationBuffer, &_totalEncodeTime, sizeof(_totalEncodeTime));
|
||||
destinationBuffer += sizeof(_totalEncodeTime);
|
||||
memcpy(destinationBuffer, &_isFullScene, sizeof(_isFullScene));
|
||||
destinationBuffer += sizeof(_isFullScene);
|
||||
memcpy(destinationBuffer, &_isMoving, sizeof(_isMoving));
|
||||
destinationBuffer += sizeof(_isMoving);
|
||||
memcpy(destinationBuffer, &_packets, sizeof(_packets));
|
||||
destinationBuffer += sizeof(_packets);
|
||||
memcpy(destinationBuffer, &_bytes, sizeof(_bytes));
|
||||
destinationBuffer += sizeof(_bytes);
|
||||
int OctreeSceneStats::packIntoPacket() {
|
||||
_statsPacket->reset();
|
||||
|
||||
memcpy(destinationBuffer, &_totalInternal, sizeof(_totalInternal));
|
||||
destinationBuffer += sizeof(_totalInternal);
|
||||
memcpy(destinationBuffer, &_totalLeaves, sizeof(_totalLeaves));
|
||||
destinationBuffer += sizeof(_totalLeaves);
|
||||
memcpy(destinationBuffer, &_internal, sizeof(_internal));
|
||||
destinationBuffer += sizeof(_internal);
|
||||
memcpy(destinationBuffer, &_leaves, sizeof(_leaves));
|
||||
destinationBuffer += sizeof(_leaves);
|
||||
memcpy(destinationBuffer, &_internalSkippedDistance, sizeof(_internalSkippedDistance));
|
||||
destinationBuffer += sizeof(_internalSkippedDistance);
|
||||
memcpy(destinationBuffer, &_leavesSkippedDistance, sizeof(_leavesSkippedDistance));
|
||||
destinationBuffer += sizeof(_leavesSkippedDistance);
|
||||
memcpy(destinationBuffer, &_internalSkippedOutOfView, sizeof(_internalSkippedOutOfView));
|
||||
destinationBuffer += sizeof(_internalSkippedOutOfView);
|
||||
memcpy(destinationBuffer, &_leavesSkippedOutOfView, sizeof(_leavesSkippedOutOfView));
|
||||
destinationBuffer += sizeof(_leavesSkippedOutOfView);
|
||||
memcpy(destinationBuffer, &_internalSkippedWasInView, sizeof(_internalSkippedWasInView));
|
||||
destinationBuffer += sizeof(_internalSkippedWasInView);
|
||||
memcpy(destinationBuffer, &_leavesSkippedWasInView, sizeof(_leavesSkippedWasInView));
|
||||
destinationBuffer += sizeof(_leavesSkippedWasInView);
|
||||
memcpy(destinationBuffer, &_internalSkippedNoChange, sizeof(_internalSkippedNoChange));
|
||||
destinationBuffer += sizeof(_internalSkippedNoChange);
|
||||
memcpy(destinationBuffer, &_leavesSkippedNoChange, sizeof(_leavesSkippedNoChange));
|
||||
destinationBuffer += sizeof(_leavesSkippedNoChange);
|
||||
memcpy(destinationBuffer, &_internalSkippedOccluded, sizeof(_internalSkippedOccluded));
|
||||
destinationBuffer += sizeof(_internalSkippedOccluded);
|
||||
memcpy(destinationBuffer, &_leavesSkippedOccluded, sizeof(_leavesSkippedOccluded));
|
||||
destinationBuffer += sizeof(_leavesSkippedOccluded);
|
||||
memcpy(destinationBuffer, &_internalColorSent, sizeof(_internalColorSent));
|
||||
destinationBuffer += sizeof(_internalColorSent);
|
||||
memcpy(destinationBuffer, &_leavesColorSent, sizeof(_leavesColorSent));
|
||||
destinationBuffer += sizeof(_leavesColorSent);
|
||||
memcpy(destinationBuffer, &_internalDidntFit, sizeof(_internalDidntFit));
|
||||
destinationBuffer += sizeof(_internalDidntFit);
|
||||
memcpy(destinationBuffer, &_leavesDidntFit, sizeof(_leavesDidntFit));
|
||||
destinationBuffer += sizeof(_leavesDidntFit);
|
||||
memcpy(destinationBuffer, &_colorBitsWritten, sizeof(_colorBitsWritten));
|
||||
destinationBuffer += sizeof(_colorBitsWritten);
|
||||
memcpy(destinationBuffer, &_existsBitsWritten, sizeof(_existsBitsWritten));
|
||||
destinationBuffer += sizeof(_existsBitsWritten);
|
||||
memcpy(destinationBuffer, &_existsInPacketBitsWritten, sizeof(_existsInPacketBitsWritten));
|
||||
destinationBuffer += sizeof(_existsInPacketBitsWritten);
|
||||
memcpy(destinationBuffer, &_treesRemoved, sizeof(_treesRemoved));
|
||||
destinationBuffer += sizeof(_treesRemoved);
|
||||
_statsPacket->write(&_start, sizeof(_start));
|
||||
_statsPacket->write(&_end, sizeof(_end));
|
||||
_statsPacket->write(&_elapsed, sizeof(_elapsed));
|
||||
_statsPacket->write(&_totalEncodeTime, sizeof(_totalEncodeTime));
|
||||
_statsPacket->write(&_isFullScene, sizeof(_isFullScene));
|
||||
_statsPacket->write(&_isMoving, sizeof(_isMoving));
|
||||
_statsPacket->write(&_packets, sizeof(_packets));
|
||||
_statsPacket->write(&_bytes, sizeof(_bytes));
|
||||
|
||||
_statsPacket->write(&_totalInternal, sizeof(_totalInternal));
|
||||
_statsPacket->write(&_totalLeaves, sizeof(_totalLeaves));
|
||||
_statsPacket->write(&_internal, sizeof(_internal));
|
||||
_statsPacket->write(&_leaves, sizeof(_leaves));
|
||||
_statsPacket->write(&_internalSkippedDistance, sizeof(_internalSkippedDistance));
|
||||
_statsPacket->write(&_leavesSkippedDistance, sizeof(_leavesSkippedDistance));
|
||||
_statsPacket->write(&_internalSkippedOutOfView, sizeof(_internalSkippedOutOfView));
|
||||
_statsPacket->write(&_leavesSkippedOutOfView, sizeof(_leavesSkippedOutOfView));
|
||||
_statsPacket->write(&_internalSkippedWasInView, sizeof(_internalSkippedWasInView));
|
||||
_statsPacket->write(&_leavesSkippedWasInView, sizeof(_leavesSkippedWasInView));
|
||||
_statsPacket->write(&_internalSkippedNoChange, sizeof(_internalSkippedNoChange));
|
||||
_statsPacket->write(&_leavesSkippedNoChange, sizeof(_leavesSkippedNoChange));
|
||||
_statsPacket->write(&_internalSkippedOccluded, sizeof(_internalSkippedOccluded));
|
||||
_statsPacket->write(&_leavesSkippedOccluded, sizeof(_leavesSkippedOccluded));
|
||||
_statsPacket->write(&_internalColorSent, sizeof(_internalColorSent));
|
||||
_statsPacket->write(&_leavesColorSent, sizeof(_leavesColorSent));
|
||||
_statsPacket->write(&_internalDidntFit, sizeof(_internalDidntFit));
|
||||
_statsPacket->write(&_leavesDidntFit, sizeof(_leavesDidntFit));
|
||||
_statsPacket->write(&_colorBitsWritten, sizeof(_colorBitsWritten));
|
||||
_statsPacket->write(&_existsBitsWritten, sizeof(_existsBitsWritten));
|
||||
_statsPacket->write(&_existsInPacketBitsWritten, sizeof(_existsInPacketBitsWritten));
|
||||
_statsPacket->write(&_treesRemoved, sizeof(_treesRemoved));
|
||||
|
||||
// add the root jurisdiction
|
||||
if (_jurisdictionRoot) {
|
||||
// copy the
|
||||
// copy the
|
||||
int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(_jurisdictionRoot));
|
||||
memcpy(destinationBuffer, &bytes, sizeof(bytes));
|
||||
destinationBuffer += sizeof(bytes);
|
||||
memcpy(destinationBuffer, _jurisdictionRoot, bytes);
|
||||
destinationBuffer += bytes;
|
||||
|
||||
// if and only if there's a root jurisdiction, also include the end elements
|
||||
int endNodeCount = _jurisdictionEndNodes.size();
|
||||
_statsPacket->write(&bytes, sizeof(bytes));
|
||||
_statsPacket->write(_jurisdictionRoot, bytes);
|
||||
|
||||
memcpy(destinationBuffer, &endNodeCount, sizeof(endNodeCount));
|
||||
destinationBuffer += sizeof(endNodeCount);
|
||||
// if and only if there's a root jurisdiction, also include the end elements
|
||||
int endNodeCount = _jurisdictionEndNodes.size();
|
||||
|
||||
_statsPacket->write(&endNodeCount, sizeof(endNodeCount));
|
||||
|
||||
for (int i=0; i < endNodeCount; i++) {
|
||||
unsigned char* endNodeCode = _jurisdictionEndNodes[i];
|
||||
int bytes = bytesRequiredForCodeLength(numberOfThreeBitSectionsInCode(endNodeCode));
|
||||
memcpy(destinationBuffer, &bytes, sizeof(bytes));
|
||||
destinationBuffer += sizeof(bytes);
|
||||
memcpy(destinationBuffer, endNodeCode, bytes);
|
||||
destinationBuffer += bytes;
|
||||
_statsPacket->write(&bytes, sizeof(bytes));
|
||||
_statsPacket->write(endNodeCode, bytes);
|
||||
}
|
||||
} else {
|
||||
int bytes = 0;
|
||||
memcpy(destinationBuffer, &bytes, sizeof(bytes));
|
||||
destinationBuffer += sizeof(bytes);
|
||||
_statsPacket->write(&bytes, sizeof(bytes));
|
||||
}
|
||||
|
||||
return destinationBuffer - bufferStart; // includes header!
|
||||
|
||||
return _statsPacket->getSizeUsed();
|
||||
}
|
||||
|
||||
int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes) {
|
||||
|
@ -489,7 +448,7 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a
|
|||
// increment to push past the packet header
|
||||
int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast<const char*>(sourceBuffer));
|
||||
sourceBuffer += numBytesPacketHeader;
|
||||
|
||||
|
||||
memcpy(&_start, sourceBuffer, sizeof(_start));
|
||||
sourceBuffer += sizeof(_start);
|
||||
memcpy(&_end, sourceBuffer, sizeof(_end));
|
||||
|
@ -526,13 +485,13 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a
|
|||
memcpy(&_leaves, sourceBuffer, sizeof(_leaves));
|
||||
sourceBuffer += sizeof(_leaves);
|
||||
_traversed = _internal + _leaves;
|
||||
|
||||
|
||||
memcpy(&_internalSkippedDistance, sourceBuffer, sizeof(_internalSkippedDistance));
|
||||
sourceBuffer += sizeof(_internalSkippedDistance);
|
||||
memcpy(&_leavesSkippedDistance, sourceBuffer, sizeof(_leavesSkippedDistance));
|
||||
sourceBuffer += sizeof(_leavesSkippedDistance);
|
||||
_skippedDistance = _internalSkippedDistance + _leavesSkippedDistance;
|
||||
|
||||
|
||||
memcpy(&_internalSkippedOutOfView, sourceBuffer, sizeof(_internalSkippedOutOfView));
|
||||
sourceBuffer += sizeof(_internalSkippedOutOfView);
|
||||
memcpy(&_leavesSkippedOutOfView, sourceBuffer, sizeof(_leavesSkippedOutOfView));
|
||||
|
@ -619,7 +578,7 @@ int OctreeSceneStats::unpackFromMessage(const unsigned char* sourceBuffer, int a
|
|||
_jurisdictionEndNodes.push_back(endNodeCode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// running averages
|
||||
_elapsedAverage.updateAverage((float)_elapsed);
|
||||
unsigned long total = _existsInPacketBitsWritten + _colorSent;
|
||||
|
@ -732,75 +691,75 @@ const char* OctreeSceneStats::getItemValue(Item item) {
|
|||
unsigned long total = _existsInPacketBitsWritten + _colorSent;
|
||||
float calculatedBPV = total == 0 ? 0 : (_bytes * 8) / total;
|
||||
float averageBPV = _bitsPerOctreeAverage.getAverage();
|
||||
sprintf(_itemValueBuffer, "%lu (%.2f bits/octree Average: %.2f bits/octree) %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu (%.2f bits/octree Average: %.2f bits/octree) %lu internal %lu leaves",
|
||||
total, (double)calculatedBPV, (double)averageBPV,
|
||||
(long unsigned int)_existsInPacketBitsWritten,
|
||||
(long unsigned int)_colorSent);
|
||||
break;
|
||||
}
|
||||
case ITEM_TRAVERSED: {
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
(long unsigned int)_traversed, (long unsigned int)_internal, (long unsigned int)_leaves);
|
||||
break;
|
||||
}
|
||||
case ITEM_SKIPPED: {
|
||||
unsigned long total = _skippedDistance + _skippedOutOfView +
|
||||
unsigned long total = _skippedDistance + _skippedOutOfView +
|
||||
_skippedWasInView + _skippedNoChange + _skippedOccluded;
|
||||
|
||||
unsigned long internal = _internalSkippedDistance + _internalSkippedOutOfView +
|
||||
|
||||
unsigned long internal = _internalSkippedDistance + _internalSkippedOutOfView +
|
||||
_internalSkippedWasInView + _internalSkippedNoChange + _internalSkippedOccluded;
|
||||
|
||||
unsigned long leaves = _leavesSkippedDistance + _leavesSkippedOutOfView +
|
||||
|
||||
unsigned long leaves = _leavesSkippedDistance + _leavesSkippedOutOfView +
|
||||
_leavesSkippedWasInView + _leavesSkippedNoChange + _leavesSkippedOccluded;
|
||||
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
total, internal, leaves);
|
||||
break;
|
||||
}
|
||||
case ITEM_SKIPPED_DISTANCE: {
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
(long unsigned int)_skippedDistance,
|
||||
(long unsigned int)_internalSkippedDistance,
|
||||
(long unsigned int)_leavesSkippedDistance);
|
||||
break;
|
||||
}
|
||||
case ITEM_SKIPPED_OUT_OF_VIEW: {
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
(long unsigned int)_skippedOutOfView,
|
||||
(long unsigned int)_internalSkippedOutOfView,
|
||||
(long unsigned int)_leavesSkippedOutOfView);
|
||||
break;
|
||||
}
|
||||
case ITEM_SKIPPED_WAS_IN_VIEW: {
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
(long unsigned int)_skippedWasInView,
|
||||
(long unsigned int)_internalSkippedWasInView,
|
||||
(long unsigned int)_leavesSkippedWasInView);
|
||||
break;
|
||||
}
|
||||
case ITEM_SKIPPED_NO_CHANGE: {
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
(long unsigned int)_skippedNoChange,
|
||||
(long unsigned int)_internalSkippedNoChange,
|
||||
(long unsigned int)_leavesSkippedNoChange);
|
||||
break;
|
||||
}
|
||||
case ITEM_SKIPPED_OCCLUDED: {
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
(long unsigned int)_skippedOccluded,
|
||||
(long unsigned int)_internalSkippedOccluded,
|
||||
(long unsigned int)_leavesSkippedOccluded);
|
||||
break;
|
||||
}
|
||||
case ITEM_COLORS: {
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves",
|
||||
(long unsigned int)_colorSent,
|
||||
(long unsigned int)_internalColorSent,
|
||||
(long unsigned int)_leavesColorSent);
|
||||
break;
|
||||
}
|
||||
case ITEM_DIDNT_FIT: {
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves (removed: %lu)",
|
||||
sprintf(_itemValueBuffer, "%lu total %lu internal %lu leaves (removed: %lu)",
|
||||
(long unsigned int)_didntFit,
|
||||
(long unsigned int)_internalDidntFit,
|
||||
(long unsigned int)_leavesDidntFit,
|
||||
|
@ -808,14 +767,14 @@ const char* OctreeSceneStats::getItemValue(Item item) {
|
|||
break;
|
||||
}
|
||||
case ITEM_BITS: {
|
||||
sprintf(_itemValueBuffer, "colors: %lu, exists: %lu, in packets: %lu",
|
||||
sprintf(_itemValueBuffer, "colors: %lu, exists: %lu, in packets: %lu",
|
||||
(long unsigned int)_colorBitsWritten,
|
||||
(long unsigned int)_existsBitsWritten,
|
||||
(long unsigned int)_existsInPacketBitsWritten);
|
||||
break;
|
||||
}
|
||||
case ITEM_MODE: {
|
||||
sprintf(_itemValueBuffer, "%s - %s", (_isFullScene ? "Full Scene" : "Partial Scene"),
|
||||
sprintf(_itemValueBuffer, "%s - %s", (_isFullScene ? "Full Scene" : "Partial Scene"),
|
||||
(_isMoving ? "Moving" : "Stationary"));
|
||||
break;
|
||||
}
|
||||
|
@ -842,7 +801,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet,
|
|||
|
||||
//bool packetIsColored = oneAtBit(flags, PACKET_IS_COLOR_BIT);
|
||||
//bool packetIsCompressed = oneAtBit(flags, PACKET_IS_COMPRESSED_BIT);
|
||||
|
||||
|
||||
OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow();
|
||||
qint64 flightTime = arrivedAt - sentAt + nodeClockSkewUsec;
|
||||
|
||||
|
@ -865,7 +824,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet,
|
|||
<< "nodeClockSkewUsec:" << nodeClockSkewUsec << "usecs";;
|
||||
return; // ignore any packets that are unreasonable
|
||||
}
|
||||
|
||||
|
||||
_incomingOctreeSequenceNumberStats.sequenceNumberReceived(sequence);
|
||||
|
||||
// track packets here...
|
||||
|
|
|
@ -91,7 +91,7 @@ public:
|
|||
void childBitsRemoved(bool includesExistsBits, bool includesColors);
|
||||
|
||||
/// Pack the details of the statistics into a buffer for sending as a network packet
|
||||
int packIntoMessage(unsigned char* destinationBuffer, int availableBytes);
|
||||
int packIntoPacket();
|
||||
|
||||
/// Unpack the details of the statistics from a buffer typically received as a network packet
|
||||
int unpackFromMessage(const unsigned char* sourceBuffer, int availableBytes);
|
||||
|
@ -102,8 +102,7 @@ public:
|
|||
/// Mark that the scene statistics have been sent
|
||||
void markAsSent() { _isReadyToSend = false; }
|
||||
|
||||
unsigned char* getStatsMessage() { return &_statsMessage[0]; }
|
||||
int getStatsMessageLength() const { return _statsMessageLength; }
|
||||
NLPacket& getStatsMessage() { return *_statsPacket; }
|
||||
|
||||
/// List of various items tracked by OctreeSceneStats which can be accessed via getItemInfo() and getItemValue()
|
||||
enum Item {
|
||||
|
@ -176,9 +175,8 @@ private:
|
|||
void copyFromOther(const OctreeSceneStats& other);
|
||||
|
||||
bool _isReadyToSend;
|
||||
unsigned char _statsMessage[MAX_PACKET_SIZE];
|
||||
|
||||
qint32 _statsMessageLength;
|
||||
std::unique_ptr<NLPacket> _statsPacket { NLPacket::create(PacketType::OctreeStats); }
|
||||
|
||||
// scene timing data in usecs
|
||||
bool _isStarted;
|
||||
|
|
Loading…
Reference in a new issue