mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 08:23:04 +02:00
Renaming in main loop to make source/destination clear
Also comment clean-up, etc
This commit is contained in:
parent
5a8ecdffab
commit
64a2025bcd
1 changed files with 62 additions and 61 deletions
|
@ -320,21 +320,21 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
|
|
||||||
_stats.nodesBroadcastedTo++;
|
_stats.nodesBroadcastedTo++;
|
||||||
|
|
||||||
AvatarMixerClientData* nodeData = reinterpret_cast<AvatarMixerClientData*>(destinationNode->getLinkedData());
|
AvatarMixerClientData* destinationNodeData = reinterpret_cast<AvatarMixerClientData*>(destinationNode->getLinkedData());
|
||||||
|
|
||||||
nodeData->resetInViewStats();
|
destinationNodeData->resetInViewStats();
|
||||||
|
|
||||||
const AvatarData& avatar = nodeData->getAvatar();
|
const AvatarData& avatar = destinationNodeData->getAvatar();
|
||||||
glm::vec3 myPosition = avatar.getClientGlobalPosition();
|
glm::vec3 myPosition = avatar.getClientGlobalPosition();
|
||||||
|
|
||||||
// reset the internal state for correct random number distribution
|
// reset the internal state for correct random number distribution
|
||||||
distribution.reset();
|
distribution.reset();
|
||||||
|
|
||||||
// Estimate number to sort on number sent last frame (with min. of 20).
|
// Estimate number to sort on number sent last frame (with min. of 20).
|
||||||
const int numToSendEst = std::max(int(nodeData->getNumAvatarsSentLastFrame() * 2.5f), 20);
|
const int numToSendEst = std::max(int(destinationNodeData->getNumAvatarsSentLastFrame() * 2.5f), 20);
|
||||||
|
|
||||||
// reset the number of sent avatars
|
// reset the number of sent avatars
|
||||||
nodeData->resetNumAvatarsSentLastFrame();
|
destinationNodeData->resetNumAvatarsSentLastFrame();
|
||||||
|
|
||||||
// keep track of outbound data rate specifically for avatar data
|
// keep track of outbound data rate specifically for avatar data
|
||||||
int numAvatarDataBytes = 0;
|
int numAvatarDataBytes = 0;
|
||||||
|
@ -353,8 +353,8 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
|
|
||||||
// When this is true, the AvatarMixer will send Avatar data to a client
|
// When this is true, the AvatarMixer will send Avatar data to a client
|
||||||
// about avatars they've ignored or that are out of view
|
// about avatars they've ignored or that are out of view
|
||||||
bool PALIsOpen = nodeData->getRequestsDomainListData();
|
bool PALIsOpen = destinationNodeData->getRequestsDomainListData();
|
||||||
bool PALWasOpen = nodeData->getPrevRequestsDomainListData();
|
bool PALWasOpen = destinationNodeData->getPrevRequestsDomainListData();
|
||||||
|
|
||||||
// When this is true, the AvatarMixer will send Avatar data to a client about avatars that have ignored them
|
// When this is true, the AvatarMixer will send Avatar data to a client about avatars that have ignored them
|
||||||
bool getsAnyIgnored = PALIsOpen && destinationNode->getCanKick();
|
bool getsAnyIgnored = PALIsOpen && destinationNode->getCanKick();
|
||||||
|
@ -368,7 +368,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
AABox nodeBox = computeBubbleBox(avatar, MY_AVATAR_BUBBLE_EXPANSION_FACTOR);
|
AABox nodeBox = computeBubbleBox(avatar, MY_AVATAR_BUBBLE_EXPANSION_FACTOR);
|
||||||
|
|
||||||
// prepare to sort
|
// prepare to sort
|
||||||
const auto& cameraViews = nodeData->getViewFrustums();
|
const auto& cameraViews = destinationNodeData->getViewFrustums();
|
||||||
|
|
||||||
using AvatarPriorityQueue = PrioritySortUtil::PriorityQueue<SortableAvatar>;
|
using AvatarPriorityQueue = PrioritySortUtil::PriorityQueue<SortableAvatar>;
|
||||||
// Keep two independent queues, one for heroes and one for the riff-raff.
|
// Keep two independent queues, one for heroes and one for the riff-raff.
|
||||||
|
@ -391,47 +391,47 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto avatarNode = otherNodeRaw;
|
auto sourceAvatarNode = otherNodeRaw;
|
||||||
|
|
||||||
bool shouldIgnore = false;
|
bool sendAvatar = true; // We will consider this source avatar for sending.
|
||||||
// We ignore other nodes for a couple of reasons:
|
// We ignore other nodes for a couple of reasons:
|
||||||
// 1) ignore bubbles and ignore specific node
|
// 1) ignore bubbles and ignore specific node
|
||||||
// 2) the node hasn't really updated it's frame data recently, this can
|
// 2) the node hasn't really updated it's frame data recently, this can
|
||||||
// happen if for example the avatar is connected on a desktop and sending
|
// happen if for example the avatar is connected on a desktop and sending
|
||||||
// updates at ~30hz. So every 3 frames we skip a frame.
|
// updates at ~30hz. So every 3 frames we skip a frame.
|
||||||
|
|
||||||
assert(avatarNode); // we can't have gotten here without the avatarData being a valid key in the map
|
assert(sourceAvatarNode); // we can't have gotten here without the avatarData being a valid key in the map
|
||||||
|
|
||||||
const AvatarMixerClientData* avatarClientNodeData = reinterpret_cast<const AvatarMixerClientData*>(avatarNode->getLinkedData());
|
const AvatarMixerClientData* sourceAvatarNodeData = reinterpret_cast<const AvatarMixerClientData*>(sourceAvatarNode->getLinkedData());
|
||||||
assert(avatarClientNodeData); // we can't have gotten here without avatarNode having valid data
|
assert(sourceAvatarNodeData); // we can't have gotten here without sourceAvatarNode having valid data
|
||||||
quint64 startIgnoreCalculation = usecTimestampNow();
|
quint64 startIgnoreCalculation = usecTimestampNow();
|
||||||
|
|
||||||
// make sure we have data for this avatar, that it isn't the same node,
|
// make sure we have data for this avatar, that it isn't the same node,
|
||||||
// and isn't an avatar that the viewing node has ignored
|
// and isn't an avatar that the viewing node has ignored
|
||||||
// or that has ignored the viewing node
|
// or that has ignored the viewing node
|
||||||
if ((destinationNode->isIgnoringNodeWithID(avatarNode->getUUID()) && !PALIsOpen)
|
if ((destinationNode->isIgnoringNodeWithID(sourceAvatarNode->getUUID()) && !PALIsOpen)
|
||||||
|| (avatarNode->isIgnoringNodeWithID(destinationNode->getUUID()) && !getsAnyIgnored)) {
|
|| (sourceAvatarNode->isIgnoringNodeWithID(destinationNode->getUUID()) && !getsAnyIgnored)) {
|
||||||
shouldIgnore = true;
|
sendAvatar = false;
|
||||||
} else {
|
} else {
|
||||||
// Check to see if the space bubble is enabled
|
// Check to see if the space bubble is enabled
|
||||||
// Don't bother with these checks if the other avatar has their bubble enabled and we're gettingAnyIgnored
|
// Don't bother with these checks if the other avatar has their bubble enabled and we're gettingAnyIgnored
|
||||||
if (nodeData->isIgnoreRadiusEnabled() || (avatarClientNodeData->isIgnoreRadiusEnabled() && !getsAnyIgnored)) {
|
if (destinationNodeData->isIgnoreRadiusEnabled() || (sourceAvatarNodeData->isIgnoreRadiusEnabled() && !getsAnyIgnored)) {
|
||||||
// Perform the collision check between the two bounding boxes
|
// Perform the collision check between the two bounding boxes
|
||||||
AABox otherNodeBox = avatarClientNodeData->getAvatar().getDefaultBubbleBox();
|
AABox otherNodeBox = sourceAvatarNodeData->getAvatar().getDefaultBubbleBox();
|
||||||
if (nodeBox.touches(otherNodeBox)) {
|
if (nodeBox.touches(otherNodeBox)) {
|
||||||
nodeData->ignoreOther(destinationNode, avatarNode);
|
destinationNodeData->ignoreOther(destinationNode, sourceAvatarNode);
|
||||||
shouldIgnore = !getsAnyIgnored;
|
sendAvatar = getsAnyIgnored;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Not close enough to ignore
|
// Not close enough to ignore
|
||||||
if (!shouldIgnore) {
|
if (sendAvatar) {
|
||||||
nodeData->removeFromRadiusIgnoringSet(avatarNode->getUUID());
|
destinationNodeData->removeFromRadiusIgnoringSet(sourceAvatarNode->getUUID());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!shouldIgnore) {
|
if (sendAvatar) {
|
||||||
AvatarDataSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(avatarNode->getLocalID());
|
AvatarDataSequenceNumber lastSeqToReceiver = destinationNodeData->getLastBroadcastSequenceNumber(sourceAvatarNode->getLocalID());
|
||||||
AvatarDataSequenceNumber lastSeqFromSender = avatarClientNodeData->getLastReceivedSequenceNumber();
|
AvatarDataSequenceNumber lastSeqFromSender = sourceAvatarNodeData->getLastReceivedSequenceNumber();
|
||||||
|
|
||||||
// FIXME - This code does appear to be working. But it seems brittle.
|
// FIXME - This code does appear to be working. But it seems brittle.
|
||||||
// It supports determining if the frame of data for this "other"
|
// It supports determining if the frame of data for this "other"
|
||||||
|
@ -445,12 +445,12 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
// or that somehow we haven't sent
|
// or that somehow we haven't sent
|
||||||
if (lastSeqToReceiver == lastSeqFromSender && lastSeqToReceiver != 0) {
|
if (lastSeqToReceiver == lastSeqFromSender && lastSeqToReceiver != 0) {
|
||||||
++numAvatarsHeldBack;
|
++numAvatarsHeldBack;
|
||||||
shouldIgnore = true;
|
sendAvatar = false;
|
||||||
} else if (lastSeqFromSender == 0) {
|
} else if (lastSeqFromSender == 0) {
|
||||||
// We have have not yet recieved any data about this avatar. Ignore it for now
|
// We have have not yet received any data about this avatar. Ignore it for now
|
||||||
// This is important for Agent scripts that are not avatar
|
// This is important for Agent scripts that are not avatar
|
||||||
// so that they don't appear to be an avatar at the origin
|
// so that they don't appear to be an avatar at the origin
|
||||||
shouldIgnore = true;
|
sendAvatar = false;
|
||||||
} else if (lastSeqFromSender - lastSeqToReceiver > 1) {
|
} else if (lastSeqFromSender - lastSeqToReceiver > 1) {
|
||||||
// this is a skip - we still send the packet but capture the presence of the skip so we see it happening
|
// this is a skip - we still send the packet but capture the presence of the skip so we see it happening
|
||||||
++numAvatarsWithSkippedFrames;
|
++numAvatarsWithSkippedFrames;
|
||||||
|
@ -459,13 +459,13 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
quint64 endIgnoreCalculation = usecTimestampNow();
|
quint64 endIgnoreCalculation = usecTimestampNow();
|
||||||
_stats.ignoreCalculationElapsedTime += (endIgnoreCalculation - startIgnoreCalculation);
|
_stats.ignoreCalculationElapsedTime += (endIgnoreCalculation - startIgnoreCalculation);
|
||||||
|
|
||||||
if (!shouldIgnore) {
|
if (sendAvatar) {
|
||||||
// sort this one for later
|
// sort this one for later
|
||||||
const MixerAvatar* avatarNodeData = avatarClientNodeData->getConstAvatarData();
|
const MixerAvatar* avatarNodeData = sourceAvatarNodeData->getConstAvatarData();
|
||||||
auto lastEncodeTime = nodeData->getLastOtherAvatarEncodeTime(avatarNode->getLocalID());
|
auto lastEncodeTime = destinationNodeData->getLastOtherAvatarEncodeTime(sourceAvatarNode->getLocalID());
|
||||||
|
|
||||||
avatarPriorityQueues[avatarNodeData->getPriorityAvatar() ? kHero : kNonhero].push(
|
avatarPriorityQueues[avatarNodeData->getPriorityAvatar() ? kHero : kNonhero].push(
|
||||||
SortableAvatar(avatarNodeData, avatarNode, lastEncodeTime));
|
SortableAvatar(avatarNodeData, sourceAvatarNode, lastEncodeTime));
|
||||||
}
|
}
|
||||||
|
|
||||||
// If Avatar A's PAL WAS open but is no longer open, AND
|
// If Avatar A's PAL WAS open but is no longer open, AND
|
||||||
|
@ -475,18 +475,18 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
// will be sent when it doesn't need to be (but where it _should_ be OK to send).
|
// will be sent when it doesn't need to be (but where it _should_ be OK to send).
|
||||||
// However, it's less heavy-handed than using `shouldIgnore`.
|
// However, it's less heavy-handed than using `shouldIgnore`.
|
||||||
if (PALWasOpen && !PALIsOpen &&
|
if (PALWasOpen && !PALIsOpen &&
|
||||||
(destinationNode->isIgnoringNodeWithID(avatarNode->getUUID()) ||
|
(destinationNode->isIgnoringNodeWithID(sourceAvatarNode->getUUID()) ||
|
||||||
avatarNode->isIgnoringNodeWithID(destinationNode->getUUID()))) {
|
sourceAvatarNode->isIgnoringNodeWithID(destinationNode->getUUID()))) {
|
||||||
// ...send a Kill Packet to Node A, instructing Node A to kill Avatar B,
|
// ...send a Kill Packet to Node A, instructing Node A to kill Avatar B,
|
||||||
// then have Node A cleanup the killed Node B.
|
// then have Node A cleanup the killed Node B.
|
||||||
auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason), true);
|
auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason), true);
|
||||||
packet->write(avatarNode->getUUID().toRfc4122());
|
packet->write(sourceAvatarNode->getUUID().toRfc4122());
|
||||||
packet->writePrimitive(KillAvatarReason::AvatarIgnored);
|
packet->writePrimitive(KillAvatarReason::AvatarIgnored);
|
||||||
nodeList->sendPacket(std::move(packet), *destinationNode);
|
nodeList->sendPacket(std::move(packet), *destinationNode);
|
||||||
nodeData->cleanupKilledNode(avatarNode->getUUID(), avatarNode->getLocalID());
|
destinationNodeData->cleanupKilledNode(sourceAvatarNode->getUUID(), sourceAvatarNode->getLocalID());
|
||||||
}
|
}
|
||||||
|
|
||||||
nodeData->setPrevRequestsDomainListData(PALIsOpen);
|
destinationNodeData->setPrevRequestsDomainListData(PALIsOpen);
|
||||||
}
|
}
|
||||||
|
|
||||||
// loop through our sorted avatars and allocate our bandwidth to them accordingly
|
// loop through our sorted avatars and allocate our bandwidth to them accordingly
|
||||||
|
@ -501,13 +501,14 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
int numAvatarsSent = 0;
|
int numAvatarsSent = 0;
|
||||||
auto identityPacketList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true);
|
auto identityPacketList = NLPacketList::create(PacketType::AvatarIdentity, QByteArray(), true, true);
|
||||||
|
|
||||||
|
// Loop over two priorities - hero avatars then everyone else:
|
||||||
for (PriorityVariants currentVariant = kHero; currentVariant <= kNonhero; ++((int&)currentVariant)) {
|
for (PriorityVariants currentVariant = kHero; currentVariant <= kNonhero; ++((int&)currentVariant)) {
|
||||||
const auto& sortedAvatarVector = avatarPriorityQueues[currentVariant].getSortedVector(numToSendEst);
|
const auto& sortedAvatarVector = avatarPriorityQueues[currentVariant].getSortedVector(numToSendEst);
|
||||||
for (const auto& sortedAvatar : sortedAvatarVector) {
|
for (const auto& sortedAvatar : sortedAvatarVector) {
|
||||||
const Node* otherNode = sortedAvatar.getNode();
|
const Node* sourceNode = sortedAvatar.getNode();
|
||||||
auto lastEncodeForOther = sortedAvatar.getTimestamp();
|
auto lastEncodeForOther = sortedAvatar.getTimestamp();
|
||||||
|
|
||||||
assert(otherNode); // we can't have gotten here without the avatarData being a valid key in the map
|
assert(sourceNode); // we can't have gotten here without the avatarData being a valid key in the map
|
||||||
|
|
||||||
AvatarData::AvatarDataDetail detail = AvatarData::NoData;
|
AvatarData::AvatarDataDetail detail = AvatarData::NoData;
|
||||||
|
|
||||||
|
@ -533,31 +534,31 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
|
|
||||||
auto startAvatarDataPacking = chrono::high_resolution_clock::now();
|
auto startAvatarDataPacking = chrono::high_resolution_clock::now();
|
||||||
|
|
||||||
const AvatarMixerClientData* otherNodeData = reinterpret_cast<const AvatarMixerClientData*>(otherNode->getLinkedData());
|
const AvatarMixerClientData* sourceNodeData = reinterpret_cast<const AvatarMixerClientData*>(sourceNode->getLinkedData());
|
||||||
const MixerAvatar* otherAvatar = otherNodeData->getConstAvatarData();
|
const MixerAvatar* sourceAvatar = sourceNodeData->getConstAvatarData();
|
||||||
|
|
||||||
// Typically all out-of-view avatars but such avatars' priorities will rise with time:
|
// Typically all out-of-view avatars but such avatars' priorities will rise with time:
|
||||||
bool isLowerPriority = sortedAvatar.getPriority() <= OUT_OF_VIEW_THRESHOLD;
|
bool isLowerPriority = sortedAvatar.getPriority() <= OUT_OF_VIEW_THRESHOLD; // XXX: hero handling?
|
||||||
|
|
||||||
if (isLowerPriority) {
|
if (isLowerPriority) {
|
||||||
detail = PALIsOpen ? AvatarData::PALMinimum : AvatarData::MinimumData;
|
detail = PALIsOpen ? AvatarData::PALMinimum : AvatarData::MinimumData;
|
||||||
nodeData->incrementAvatarOutOfView();
|
destinationNodeData->incrementAvatarOutOfView();
|
||||||
} else if (!overBudget) {
|
} else if (!overBudget) {
|
||||||
detail = distribution(generator) < AVATAR_SEND_FULL_UPDATE_RATIO ? AvatarData::SendAllData : AvatarData::CullSmallData;
|
detail = distribution(generator) < AVATAR_SEND_FULL_UPDATE_RATIO ? AvatarData::SendAllData : AvatarData::CullSmallData;
|
||||||
nodeData->incrementAvatarInView();
|
destinationNodeData->incrementAvatarInView();
|
||||||
|
|
||||||
// If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO
|
// If the time that the mixer sent AVATAR DATA about Avatar B to Avatar A is BEFORE OR EQUAL TO
|
||||||
// the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A.
|
// the time that Avatar B flagged an IDENTITY DATA change, send IDENTITY DATA about Avatar B to Avatar A.
|
||||||
if (otherAvatar->hasProcessedFirstIdentity()
|
if (sourceAvatar->hasProcessedFirstIdentity()
|
||||||
&& nodeData->getLastBroadcastTime(otherNode->getLocalID()) <= otherNodeData->getIdentityChangeTimestamp()) {
|
&& destinationNodeData->getLastBroadcastTime(sourceNode->getLocalID()) <= sourceNodeData->getIdentityChangeTimestamp()) {
|
||||||
identityBytesSent += sendIdentityPacket(*identityPacketList, otherNodeData, *destinationNode);
|
identityBytesSent += sendIdentityPacket(*identityPacketList, sourceNodeData, *destinationNode);
|
||||||
|
|
||||||
// remember the last time we sent identity details about this other node to the receiver
|
// remember the last time we sent identity details about this other node to the receiver
|
||||||
nodeData->setLastBroadcastTime(otherNode->getLocalID(), usecTimestampNow());
|
destinationNodeData->setLastBroadcastTime(sourceNode->getLocalID(), usecTimestampNow());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<JointData>& lastSentJointsForOther = nodeData->getLastOtherAvatarSentJoints(otherNode->getLocalID());
|
QVector<JointData>& lastSentJointsForOther = destinationNodeData->getLastOtherAvatarSentJoints(sourceNode->getLocalID());
|
||||||
|
|
||||||
const bool distanceAdjust = true;
|
const bool distanceAdjust = true;
|
||||||
const bool dropFaceTracking = false;
|
const bool dropFaceTracking = false;
|
||||||
|
@ -566,7 +567,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
|
|
||||||
do {
|
do {
|
||||||
auto startSerialize = chrono::high_resolution_clock::now();
|
auto startSerialize = chrono::high_resolution_clock::now();
|
||||||
QByteArray bytes = otherAvatar->toByteArray(detail, lastEncodeForOther, lastSentJointsForOther,
|
QByteArray bytes = sourceAvatar->toByteArray(detail, lastEncodeForOther, lastSentJointsForOther,
|
||||||
sendStatus, dropFaceTracking, distanceAdjust, myPosition,
|
sendStatus, dropFaceTracking, distanceAdjust, myPosition,
|
||||||
&lastSentJointsForOther, avatarSpaceAvailable);
|
&lastSentJointsForOther, avatarSpaceAvailable);
|
||||||
auto endSerialize = chrono::high_resolution_clock::now();
|
auto endSerialize = chrono::high_resolution_clock::now();
|
||||||
|
@ -587,17 +588,17 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
|
|
||||||
if (detail != AvatarData::NoData) {
|
if (detail != AvatarData::NoData) {
|
||||||
_stats.numOthersIncluded++;
|
_stats.numOthersIncluded++;
|
||||||
if (otherAvatar->getPriorityAvatar()) {
|
if (sourceAvatar->getPriorityAvatar()) {
|
||||||
_stats.numHeroesIncluded++;
|
_stats.numHeroesIncluded++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// increment the number of avatars sent to this receiver
|
// increment the number of avatars sent to this receiver
|
||||||
nodeData->incrementNumAvatarsSentLastFrame();
|
destinationNodeData->incrementNumAvatarsSentLastFrame();
|
||||||
|
|
||||||
// set the last sent sequence number for this sender on the receiver
|
// set the last sent sequence number for this sender on the receiver
|
||||||
nodeData->setLastBroadcastSequenceNumber(otherNode->getLocalID(),
|
destinationNodeData->setLastBroadcastSequenceNumber(sourceNode->getLocalID(),
|
||||||
otherNodeData->getLastReceivedSequenceNumber());
|
sourceNodeData->getLastReceivedSequenceNumber());
|
||||||
nodeData->setLastOtherAvatarEncodeTime(otherNode->getLocalID(), usecTimestampNow());
|
destinationNodeData->setLastOtherAvatarEncodeTime(sourceNode->getLocalID(), usecTimestampNow());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto endAvatarDataPacking = chrono::high_resolution_clock::now();
|
auto endAvatarDataPacking = chrono::high_resolution_clock::now();
|
||||||
|
@ -606,7 +607,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
|
|
||||||
if (!overBudget) {
|
if (!overBudget) {
|
||||||
// use helper to add any changed traits to our packet list
|
// use helper to add any changed traits to our packet list
|
||||||
traitBytesSent += addChangedTraitsToBulkPacket(nodeData, otherNodeData, *traitsPacketList);
|
traitBytesSent += addChangedTraitsToBulkPacket(destinationNodeData, sourceNodeData, *traitsPacketList);
|
||||||
}
|
}
|
||||||
numAvatarsSent++;
|
numAvatarsSent++;
|
||||||
remainingAvatars--;
|
remainingAvatars--;
|
||||||
|
@ -619,8 +620,8 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nodeData->getNumAvatarsSentLastFrame() > numToSendEst) {
|
if (destinationNodeData->getNumAvatarsSentLastFrame() > numToSendEst) {
|
||||||
qCWarning(avatars) << "More avatars sent than upper estimate" << nodeData->getNumAvatarsSentLastFrame()
|
qCWarning(avatars) << "More avatars sent than upper estimate" << destinationNodeData->getNumAvatarsSentLastFrame()
|
||||||
<< " / " << numToSendEst;
|
<< " / " << numToSendEst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -651,12 +652,12 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
|
||||||
}
|
}
|
||||||
|
|
||||||
// record the bytes sent for other avatar data in the AvatarMixerClientData
|
// record the bytes sent for other avatar data in the AvatarMixerClientData
|
||||||
nodeData->recordSentAvatarData(numAvatarDataBytes, traitBytesSent);
|
destinationNodeData->recordSentAvatarData(numAvatarDataBytes, traitBytesSent);
|
||||||
|
|
||||||
|
|
||||||
// record the number of avatars held back this frame
|
// record the number of avatars held back this frame
|
||||||
nodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack);
|
destinationNodeData->recordNumOtherAvatarStarves(numAvatarsHeldBack);
|
||||||
nodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames);
|
destinationNodeData->recordNumOtherAvatarSkips(numAvatarsWithSkippedFrames);
|
||||||
|
|
||||||
quint64 endPacketSending = usecTimestampNow();
|
quint64 endPacketSending = usecTimestampNow();
|
||||||
_stats.packetSendingElapsedTime += (endPacketSending - startPacketSending);
|
_stats.packetSendingElapsedTime += (endPacketSending - startPacketSending);
|
||||||
|
|
Loading…
Reference in a new issue