16 #ifndef hifi_AvatarMixer_h
17 #define hifi_AvatarMixer_h
19 #include <QtCore/QSharedPointer>
22 #include <shared/RateCounter.h>
23 #include <PortableHighResolutionClock.h>
25 #include <ThreadedAssignment.h>
26 #include "../entities/EntityTreeHeadlessViewer.h"
27 #include "AvatarMixerClientData.h"
29 #include "AvatarMixerWorkerPool.h"
36 virtual void aboutToFinish()
override;
38 static bool shouldReplicateTo(
const Node& from,
const Node& to) {
39 return to.getType() == NodeType::DownstreamAvatarMixer &&
40 to.getPublicSocket() != from.getPublicSocket() &&
41 to.getLocalSocket() != from.getLocalSocket();
48 void handleAvatarKilled(SharedNodePointer killedNode);
50 void sendStatsPacket()
override;
53 void entityAdded(EntityItem* entity);
54 void entityRemoved(EntityItem* entity);
57 void queueIncomingPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);
58 void handleAdjustAvatarSorting(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
59 void handleAvatarQueryPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
60 void handleAvatarIdentityPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
61 void handleKillAvatarPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
62 void handleNodeIgnoreRequestPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
63 void handleRadiusIgnoreRequestPacket(QSharedPointer<ReceivedMessage> packet, SharedNodePointer sendingNode);
64 void handleRequestsDomainListDataPacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
65 void handleReplicatedPacket(QSharedPointer<ReceivedMessage> message);
66 void handleReplicatedBulkAvatarPacket(QSharedPointer<ReceivedMessage> message);
67 void domainSettingsRequestComplete();
68 void handlePacketVersionMismatch(PacketType type,
const SockAddr& senderSockAddr,
const QUuid& senderUUID);
69 void handleOctreePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode);
73 AvatarMixerClientData* getOrCreateClientData(SharedNodePointer node);
74 std::chrono::microseconds timeFrame(p_high_resolution_clock::time_point& timestamp);
75 void throttle(std::chrono::microseconds duration,
int frame);
77 void parseDomainServerSettings(
const QJsonObject& domainSettings);
78 void sendIdentityPacket(AvatarMixerClientData* nodeData,
const SharedNodePointer& destinationNode);
80 void manageIdentityData(
const SharedNodePointer& node);
82 void optionallyReplicatePacket(ReceivedMessage& message,
const Node& node);
84 void setupEntityQuery();
86 p_high_resolution_clock::time_point _lastFrameTimestamp;
89 EntityTreeHeadlessViewer _entityViewer;
90 bool _dirtyHeroStatus {
true };
93 float _trailingMixRatio { 0.0f };
94 float _throttlingRatio { 0.0f };
96 int _sumListeners { 0 };
97 int _numStatFrames { 0 };
98 int _numTightLoopFrames { 0 };
99 int _sumIdentityPackets { 0 };
101 float _maxKbpsPerNode = 0.0f;
103 float _domainMinimumHeight { MIN_AVATAR_HEIGHT };
104 float _domainMaximumHeight { MAX_AVATAR_HEIGHT };
106 RateCounter<> _broadcastRate;
107 p_high_resolution_clock::time_point _lastDebugMessage;
110 struct SessionDisplayName {
111 explicit SessionDisplayName(QString baseName = QString(),
int suffix = 0) :
115 bool operator<(
const SessionDisplayName& rhs)
const;
116 bool operator==(
const SessionDisplayName& rhs)
const {
117 return _baseName == rhs._baseName && _suffix == rhs._suffix;
123 static const QRegularExpression suffixedNamePattern;
125 std::set<SessionDisplayName> _sessionDisplayNames;
127 quint64 _displayNameManagementElapsedTime { 0 };
128 quint64 _ignoreCalculationElapsedTime { 0 };
129 quint64 _avatarDataPackingElapsedTime { 0 };
130 quint64 _packetSendingElapsedTime { 0 };
132 quint64 _broadcastAvatarDataElapsedTime { 0 };
133 quint64 _broadcastAvatarDataInner { 0 };
134 quint64 _broadcastAvatarDataLockWait { 0 };
135 quint64 _broadcastAvatarDataNodeTransform { 0 };
136 quint64 _broadcastAvatarDataNodeFunctor { 0 };
138 quint64 _handleAdjustAvatarSortingElapsedTime { 0 };
139 quint64 _handleViewFrustumPacketElapsedTime { 0 };
140 quint64 _handleAvatarIdentityPacketElapsedTime { 0 };
141 quint64 _handleKillAvatarPacketElapsedTime { 0 };
142 quint64 _handleNodeIgnoreRequestPacketElapsedTime { 0 };
143 quint64 _handleRadiusIgnoreRequestPacketElapsedTime { 0 };
144 quint64 _handleRequestsDomainListDataPacketElapsedTime { 0 };
145 quint64 _processQueuedAvatarDataPacketsElapsedTime { 0 };
146 quint64 _processQueuedAvatarDataPacketsLockWaitElapsedTime { 0 };
148 quint64 _processEventsElapsedTime { 0 };
149 quint64 _sendStatsElapsedTime { 0 };
150 quint64 _queueIncomingPacketElapsedTime { 0 };
151 quint64 _lastStatsTime { usecTimestampNow() };
153 RateCounter<> _loopRate;
155 AvatarMixerWorkerPool _workerPool;
156 WorkerSharedData _workerSharedData;
Handles assignments of type AvatarMixer - distribution of avatar data to various clients.
Definition: AvatarMixer.h:32
void run() override
runs the avatar mixer
Definition: AvatarMixer.cpp:935