12 #ifndef hifi_AvatarMixerSlave_h
13 #define hifi_AvatarMixerSlave_h
17 class AvatarMixerClientData;
19 class AvatarMixerSlaveStats {
21 int nodesProcessed { 0 };
22 int packetsProcessed { 0 };
23 quint64 processIncomingPacketsElapsedTime { 0 };
25 int nodesBroadcastedTo { 0 };
26 int downstreamMixersBroadcastedTo { 0 };
27 int numDataBytesSent { 0 };
28 int numTraitsBytesSent { 0 };
29 int numIdentityBytesSent { 0 };
30 int numDataPacketsSent { 0 };
31 int numTraitsPacketsSent { 0 };
32 int numIdentityPacketsSent { 0 };
33 int numOthersIncluded { 0 };
34 int overBudgetAvatars { 0 };
35 int numHeroesIncluded { 0 };
37 quint64 ignoreCalculationElapsedTime { 0 };
38 quint64 avatarDataPackingElapsedTime { 0 };
39 quint64 packetSendingElapsedTime { 0 };
40 quint64 toByteArrayElapsedTime { 0 };
41 quint64 jobElapsedTime { 0 };
47 processIncomingPacketsElapsedTime = 0;
50 nodesBroadcastedTo = 0;
51 downstreamMixersBroadcastedTo = 0;
54 numTraitsBytesSent = 0;
55 numIdentityBytesSent = 0;
56 numDataPacketsSent = 0;
57 numTraitsPacketsSent = 0;
58 numIdentityPacketsSent = 0;
59 numOthersIncluded = 0;
60 overBudgetAvatars = 0;
61 numHeroesIncluded = 0;
63 ignoreCalculationElapsedTime = 0;
64 avatarDataPackingElapsedTime = 0;
65 packetSendingElapsedTime = 0;
66 toByteArrayElapsedTime = 0;
70 AvatarMixerSlaveStats& operator+=(
const AvatarMixerSlaveStats& rhs) {
71 nodesProcessed += rhs.nodesProcessed;
72 packetsProcessed += rhs.packetsProcessed;
73 processIncomingPacketsElapsedTime += rhs.processIncomingPacketsElapsedTime;
75 nodesBroadcastedTo += rhs.nodesBroadcastedTo;
76 downstreamMixersBroadcastedTo += rhs.downstreamMixersBroadcastedTo;
77 numDataBytesSent += rhs.numDataBytesSent;
78 numTraitsBytesSent += rhs.numTraitsBytesSent;
79 numIdentityBytesSent += rhs.numIdentityBytesSent;
80 numDataPacketsSent += rhs.numDataPacketsSent;
81 numTraitsPacketsSent += rhs.numTraitsPacketsSent;
82 numIdentityPacketsSent += rhs.numIdentityPacketsSent;
83 numOthersIncluded += rhs.numOthersIncluded;
84 overBudgetAvatars += rhs.overBudgetAvatars;
85 numHeroesIncluded += rhs.numHeroesIncluded;
87 ignoreCalculationElapsedTime += rhs.ignoreCalculationElapsedTime;
88 avatarDataPackingElapsedTime += rhs.avatarDataPackingElapsedTime;
89 packetSendingElapsedTime += rhs.packetSendingElapsedTime;
90 toByteArrayElapsedTime += rhs.toByteArrayElapsedTime;
91 jobElapsedTime += rhs.jobElapsedTime;
97 using EntityTreePointer = std::shared_ptr<EntityTree>;
99 struct SlaveSharedData {
100 QStringList skeletonURLWhitelist;
101 QUrl skeletonReplacementURL;
102 EntityTreePointer entityTree;
105 class AvatarMixerSlave {
107 AvatarMixerSlave(SlaveSharedData* sharedData) : _sharedData(sharedData) {};
108 using ConstIter = NodeList::const_iterator;
110 void configure(ConstIter begin, ConstIter end);
111 void configureBroadcast(ConstIter begin, ConstIter end,
112 p_high_resolution_clock::time_point lastFrameTimestamp,
113 float maxKbpsPerNode,
float throttlingRatio,
114 float priorityReservedFraction);
116 void processIncomingPackets(
const SharedNodePointer& node);
117 void broadcastAvatarData(
const SharedNodePointer& node);
119 void harvestStats(AvatarMixerSlaveStats& stats);
122 int sendIdentityPacket(NLPacketList& packet,
const AvatarMixerClientData* nodeData,
const Node& destinationNode);
123 int sendReplicatedIdentityPacket(
const Node& agentNode,
const AvatarMixerClientData* nodeData,
const Node& destinationNode);
125 qint64 addTraitsNodeHeader(AvatarMixerClientData* listeningNodeData,
126 const AvatarMixerClientData* sendingNodeData,
127 NLPacketList& traitsPacketList,
128 qint64 bytesWritten);
130 qint64 addChangedTraitsToBulkPacket(AvatarMixerClientData* listeningNodeData,
131 const AvatarMixerClientData* sendingNodeData,
132 NLPacketList& traitsPacketList);
134 void broadcastAvatarDataToAgent(
const SharedNodePointer& node);
135 void broadcastAvatarDataToDownstreamMixer(
const SharedNodePointer& node);
141 p_high_resolution_clock::time_point _lastFrameTimestamp;
142 float _maxKbpsPerNode { 0.0f };
143 float _throttlingRatio { 0.0f };
144 float _avatarHeroFraction { 0.4f };
146 AvatarMixerSlaveStats _stats;
147 SlaveSharedData* _sharedData;