mirror of
https://github.com/JulianGro/overte.git
synced 2025-08-05 21:29:53 +02:00
include trait bytes written in over budget calculation
This commit is contained in:
parent
e33f349d53
commit
6c204b682d
5 changed files with 50 additions and 33 deletions
|
@ -79,9 +79,9 @@ 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) {
|
||||||
|
|
||||||
auto otherNodeLocalID = sendingNodeData->getNodeLocalID();
|
auto otherNodeLocalID = sendingNodeData->getNodeLocalID();
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
|
|
@ -104,9 +104,9 @@ 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);
|
||||||
|
|
||||||
void broadcastAvatarDataToAgent(const SharedNodePointer& node);
|
void broadcastAvatarDataToAgent(const SharedNodePointer& node);
|
||||||
void broadcastAvatarDataToDownstreamMixer(const SharedNodePointer& node);
|
void broadcastAvatarDataToDownstreamMixer(const SharedNodePointer& node);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return bytesWritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarData::packTraitInstance(AvatarTraits::TraitType traitType, AvatarTraits::TraitInstanceID traitInstanceID,
|
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) {
|
||||||
|
|
|
@ -958,10 +958,10 @@ 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);
|
||||||
void processTraitInstance(AvatarTraits::TraitType traitType,
|
void processTraitInstance(AvatarTraits::TraitType traitType,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue