include trait bytes written in over budget calculation

This commit is contained in:
Stephen Birarda 2018-08-10 16:47:28 -07:00
parent e33f349d53
commit 6c204b682d
5 changed files with 50 additions and 33 deletions

View file

@ -79,7 +79,7 @@ int AvatarMixerSlave::sendIdentityPacket(const AvatarMixerClientData* nodeData,
} }
} }
void AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData, qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData,
const AvatarMixerClientData* sendingNodeData, const AvatarMixerClientData* sendingNodeData,
NLPacketList& traitsPacketList) { NLPacketList& traitsPacketList) {
@ -90,11 +90,13 @@ void AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* liste
auto timeOfLastTraitsSent = listeningNodeData->getLastOtherAvatarTraitsSendPoint(otherNodeLocalID); auto timeOfLastTraitsSent = listeningNodeData->getLastOtherAvatarTraitsSendPoint(otherNodeLocalID);
auto timeOfLastTraitsChange = sendingNodeData->getLastReceivedTraitsChange(); auto timeOfLastTraitsChange = sendingNodeData->getLastReceivedTraitsChange();
qint64 bytesWritten = 0;
if (timeOfLastTraitsChange > timeOfLastTraitsSent) { if (timeOfLastTraitsChange > timeOfLastTraitsSent) {
// there is definitely new traits data to send // there is definitely new traits data to send
// add the avatar ID to mark the beginning of traits for this avatar // add the avatar ID to mark the beginning of traits for this avatar
traitsPacketList.write(sendingNodeData->getNodeID().toRfc4122()); bytesWritten += traitsPacketList.write(sendingNodeData->getNodeID().toRfc4122());
auto sendingAvatar = sendingNodeData->getAvatarSharedPointer(); auto sendingAvatar = sendingNodeData->getAvatarSharedPointer();
@ -115,7 +117,7 @@ void AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* liste
if (lastReceivedVersions[traitType] > lastSentVersionRef) { if (lastReceivedVersions[traitType] > lastSentVersionRef) {
// there is an update to this trait, add it to the traits packet // there is an update to this trait, add it to the traits packet
sendingAvatar->packTrait(traitType, traitsPacketList, lastReceivedVersion); bytesWritten += sendingAvatar->packTrait(traitType, traitsPacketList, lastReceivedVersion);
// update the last sent version // update the last sent version
lastSentVersionRef = lastReceivedVersion; lastSentVersionRef = lastReceivedVersion;
@ -152,7 +154,7 @@ void AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* liste
if (!isDeleted && (sentInstanceIt == sentIDValuePairs.end() || receivedVersion > sentInstanceIt->value)) { if (!isDeleted && (sentInstanceIt == sentIDValuePairs.end() || receivedVersion > sentInstanceIt->value)) {
// this instance version exists and has never been sent or is newer so we need to send it // this instance version exists and has never been sent or is newer so we need to send it
sendingAvatar->packTraitInstance(traitType, instanceID, traitsPacketList, receivedVersion); bytesWritten += sendingAvatar->packTraitInstance(traitType, instanceID, traitsPacketList, receivedVersion);
if (sentInstanceIt != sentIDValuePairs.end()) { if (sentInstanceIt != sentIDValuePairs.end()) {
sentInstanceIt->value = receivedVersion; sentInstanceIt->value = receivedVersion;
@ -161,7 +163,7 @@ void AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* liste
} }
} else if (isDeleted && sentInstanceIt != sentIDValuePairs.end() && absoluteReceivedVersion > sentInstanceIt->value) { } else if (isDeleted && sentInstanceIt != sentIDValuePairs.end() && absoluteReceivedVersion > sentInstanceIt->value) {
// this instance version was deleted and we haven't sent the delete to this client yet // this instance version was deleted and we haven't sent the delete to this client yet
AvatarTraits::packInstancedTraitDelete(traitType, instanceID, traitsPacketList, absoluteReceivedVersion); bytesWritten += AvatarTraits::packInstancedTraitDelete(traitType, instanceID, traitsPacketList, absoluteReceivedVersion);
// update the last sent version for this trait instance to the absolute value of the deleted version // update the last sent version for this trait instance to the absolute value of the deleted version
sentInstanceIt->value = absoluteReceivedVersion; sentInstanceIt->value = absoluteReceivedVersion;
@ -172,12 +174,14 @@ void AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* liste
} }
// write a null trait type to mark the end of trait data for this avatar // write a null trait type to mark the end of trait data for this avatar
traitsPacketList.writePrimitive(AvatarTraits::NullTrait); bytesWritten += traitsPacketList.writePrimitive(AvatarTraits::NullTrait);
// since we send all traits for this other avatar, update the time of last traits sent // since we send all traits for this other avatar, update the time of last traits sent
// to match the time of last traits change // to match the time of last traits change
listeningNodeData->setLastOtherAvatarTraitsSendPoint(otherNodeLocalID, timeOfLastTraitsChange); listeningNodeData->setLastOtherAvatarTraitsSendPoint(otherNodeLocalID, timeOfLastTraitsChange);
} }
return bytesWritten;
} }
int AvatarMixerSlave::sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode) { int AvatarMixerSlave::sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode) {
@ -239,6 +243,7 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
// 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;
int identityBytesSent = 0; int identityBytesSent = 0;
int traitBytesSent = 0;
// max number of avatarBytes per frame // max number of avatarBytes per frame
auto maxAvatarBytesPerFrame = (_maxKbpsPerNode * BYTES_PER_KILOBIT) / AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND; auto maxAvatarBytesPerFrame = (_maxKbpsPerNode * BYTES_PER_KILOBIT) / AVATAR_MIXER_BROADCAST_FRAMES_PER_SECOND;
@ -550,7 +555,9 @@ void AvatarMixerSlave::broadcastAvatarDataToAgent(const SharedNodePointer& node)
_stats.avatarDataPackingElapsedTime += (endAvatarDataPacking - startAvatarDataPacking); _stats.avatarDataPackingElapsedTime += (endAvatarDataPacking - startAvatarDataPacking);
// use helper to add any changed traits to our packet list // use helper to add any changed traits to our packet list
addChangedTraitsToBulkPacket(nodeData, otherNodeData, *traitsPacketList); traitBytesSent += addChangedTraitsToBulkPacket(nodeData, otherNodeData, *traitsPacketList);
traitsPacketList->getDataSize();
} }
quint64 startPacketSending = usecTimestampNow(); quint64 startPacketSending = usecTimestampNow();

View file

@ -104,7 +104,7 @@ private:
int sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode); int sendIdentityPacket(const AvatarMixerClientData* nodeData, const SharedNodePointer& destinationNode);
int sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode); int sendReplicatedIdentityPacket(const Node& agentNode, const AvatarMixerClientData* nodeData, const Node& destinationNode);
void addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData, qint64 addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData,
const AvatarMixerClientData* sendingNodeData, const AvatarMixerClientData* sendingNodeData,
NLPacketList& traitsPacketList); NLPacketList& traitsPacketList);

View file

@ -1828,35 +1828,40 @@ QUrl AvatarData::getWireSafeSkeletonModelURL() const {
} }
} }
void AvatarData::packTrait(AvatarTraits::TraitType traitType, ExtendedIODevice& destination, qint64 AvatarData::packTrait(AvatarTraits::TraitType traitType, ExtendedIODevice& destination,
AvatarTraits::TraitVersion traitVersion) { AvatarTraits::TraitVersion traitVersion) {
destination.writePrimitive(traitType); qint64 bytesWritten = 0;
bytesWritten += destination.writePrimitive(traitType);
if (traitVersion > AvatarTraits::DEFAULT_TRAIT_VERSION) { if (traitVersion > AvatarTraits::DEFAULT_TRAIT_VERSION) {
AvatarTraits::TraitVersion typedVersion = traitVersion; AvatarTraits::TraitVersion typedVersion = traitVersion;
destination.writePrimitive(typedVersion); bytesWritten += destination.writePrimitive(typedVersion);
} }
if (traitType == AvatarTraits::SkeletonModelURL) { if (traitType == AvatarTraits::SkeletonModelURL) {
QByteArray encodedSkeletonURL = getWireSafeSkeletonModelURL().toEncoded(); QByteArray encodedSkeletonURL = getWireSafeSkeletonModelURL().toEncoded();
AvatarTraits::TraitWireSize encodedURLSize = encodedSkeletonURL.size(); AvatarTraits::TraitWireSize encodedURLSize = encodedSkeletonURL.size();
destination.writePrimitive(encodedURLSize); bytesWritten += destination.writePrimitive(encodedURLSize);
destination.write(encodedSkeletonURL); bytesWritten += destination.write(encodedSkeletonURL);
}
} }
void AvatarData::packTraitInstance(AvatarTraits::TraitType traitType, AvatarTraits::TraitInstanceID traitInstanceID, return bytesWritten;
}
qint64 AvatarData::packTraitInstance(AvatarTraits::TraitType traitType, AvatarTraits::TraitInstanceID traitInstanceID,
ExtendedIODevice& destination, AvatarTraits::TraitVersion traitVersion) { ExtendedIODevice& destination, AvatarTraits::TraitVersion traitVersion) {
destination.writePrimitive(traitType); qint64 bytesWritten = 0;
bytesWritten += destination.writePrimitive(traitType);
if (traitVersion > AvatarTraits::DEFAULT_TRAIT_VERSION) { if (traitVersion > AvatarTraits::DEFAULT_TRAIT_VERSION) {
AvatarTraits::TraitVersion typedVersion = traitVersion; AvatarTraits::TraitVersion typedVersion = traitVersion;
destination.writePrimitive(typedVersion); bytesWritten += destination.writePrimitive(typedVersion);
} }
destination.write(traitInstanceID.toRfc4122()); bytesWritten += destination.write(traitInstanceID.toRfc4122());
if (traitType == AvatarTraits::AvatarEntity) { if (traitType == AvatarTraits::AvatarEntity) {
// grab a read lock on the avatar entities and check for entity data for the given ID // grab a read lock on the avatar entities and check for entity data for the given ID
@ -1873,12 +1878,14 @@ void AvatarData::packTraitInstance(AvatarTraits::TraitType traitType, AvatarTrai
qDebug() << QJsonDocument::fromBinaryData(entityBinaryData).toJson(); qDebug() << QJsonDocument::fromBinaryData(entityBinaryData).toJson();
destination.writePrimitive(entityBinarySize); bytesWritten += destination.writePrimitive(entityBinarySize);
destination.write(entityBinaryData); bytesWritten += destination.write(entityBinaryData);
} else { } else {
destination.writePrimitive(AvatarTraits::DELETED_TRAIT_SIZE); bytesWritten += destination.writePrimitive(AvatarTraits::DELETED_TRAIT_SIZE);
} }
} }
return bytesWritten;
} }
void AvatarData::processTrait(AvatarTraits::TraitType traitType, QByteArray traitBinaryData) { void AvatarData::processTrait(AvatarTraits::TraitType traitType, QByteArray traitBinaryData) {

View file

@ -958,9 +958,9 @@ public:
// identityChanged returns true if identity has changed, false otherwise. Similarly for displayNameChanged and skeletonModelUrlChange. // identityChanged returns true if identity has changed, false otherwise. Similarly for displayNameChanged and skeletonModelUrlChange.
void processAvatarIdentity(const QByteArray& identityData, bool& identityChanged, bool& displayNameChanged); void processAvatarIdentity(const QByteArray& identityData, bool& identityChanged, bool& displayNameChanged);
void packTrait(AvatarTraits::TraitType traitType, ExtendedIODevice& destination, qint64 packTrait(AvatarTraits::TraitType traitType, ExtendedIODevice& destination,
AvatarTraits::TraitVersion traitVersion = AvatarTraits::NULL_TRAIT_VERSION); AvatarTraits::TraitVersion traitVersion = AvatarTraits::NULL_TRAIT_VERSION);
void packTraitInstance(AvatarTraits::TraitType traitType, AvatarTraits::TraitInstanceID instanceID, qint64 packTraitInstance(AvatarTraits::TraitType traitType, AvatarTraits::TraitInstanceID instanceID,
ExtendedIODevice& destination, AvatarTraits::TraitVersion traitVersion = AvatarTraits::NULL_TRAIT_VERSION); ExtendedIODevice& destination, AvatarTraits::TraitVersion traitVersion = AvatarTraits::NULL_TRAIT_VERSION);
void processTrait(AvatarTraits::TraitType traitType, QByteArray traitBinaryData); void processTrait(AvatarTraits::TraitType traitType, QByteArray traitBinaryData);

View file

@ -39,19 +39,22 @@ namespace AvatarTraits {
using TraitWireSize = int16_t; using TraitWireSize = int16_t;
const TraitWireSize DELETED_TRAIT_SIZE = -1; const TraitWireSize DELETED_TRAIT_SIZE = -1;
inline void packInstancedTraitDelete(TraitType traitType, TraitInstanceID instanceID, ExtendedIODevice& destination, inline qint64 packInstancedTraitDelete(TraitType traitType, TraitInstanceID instanceID, ExtendedIODevice& destination,
TraitVersion traitVersion = NULL_TRAIT_VERSION) { TraitVersion traitVersion = NULL_TRAIT_VERSION) {
destination.writePrimitive(traitType); qint64 bytesWritten = 0;
bytesWritten += destination.writePrimitive(traitType);
if (traitVersion > DEFAULT_TRAIT_VERSION) { if (traitVersion > DEFAULT_TRAIT_VERSION) {
AvatarTraits::TraitVersion typedVersion = traitVersion; AvatarTraits::TraitVersion typedVersion = traitVersion;
destination.writePrimitive(typedVersion); bytesWritten += destination.writePrimitive(typedVersion);
} }
destination.write(instanceID.toRfc4122()); bytesWritten += destination.write(instanceID.toRfc4122());
destination.writePrimitive(DELETED_TRAIT_SIZE); bytesWritten += destination.writePrimitive(DELETED_TRAIT_SIZE);
return bytesWritten;
} }
}; };