New approach to tracking no-identity duration

This commit is contained in:
Simon Walton 2018-06-22 16:42:37 -07:00
parent e5b35b1cd9
commit 269d803812
3 changed files with 16 additions and 9 deletions

View file

@ -15,6 +15,8 @@
#include <QScriptEngine>
#include "AvatarLogging.h"
#if defined(__GNUC__) && !defined(__clang__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdouble-promotion"
@ -55,7 +57,7 @@ static const quint64 MIN_TIME_BETWEEN_MY_AVATAR_DATA_SENDS = USECS_PER_SECOND /
const QUuid MY_AVATAR_KEY; // NULL key
// For an unknown avatar-data packet, wait this long before requesting the identity (in µs).
constexpr quint64 AvatarManager::REQUEST_UNKNOWN_IDENTITY_DELAY = 5 * 1000000;
constexpr quint64 AvatarManager::REQUEST_UNKNOWN_IDENTITY_DELAY = 5 * 1000 * 1000;
AvatarManager::AvatarManager(QObject* parent) :
_avatarsToFade(),
@ -283,13 +285,13 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
// Check on avatars with pending identities:
const quint64 now = usecTimestampNow();
QWriteLocker writeLock(&_hashLock);
for (auto avatarData = _pendingAvatars.begin(); avatarData != _pendingAvatars.end(); ++avatarData) {
Avatar* pendingAvatar = dynamic_cast<Avatar*>(avatarData->get());
if (now - pendingAvatar->getLastRenderUpdateTime() >= REQUEST_UNKNOWN_IDENTITY_DELAY) {
for (auto pendingAvatar = _pendingAvatars.begin(); pendingAvatar != _pendingAvatars.end(); ++pendingAvatar) {
if (now - pendingAvatar->creationTime >= REQUEST_UNKNOWN_IDENTITY_DELAY) {
// Too long without an ID
sendIdentityRequest(pendingAvatar->getID());
avatarData = _pendingAvatars.erase(avatarData);
if (avatarData == _pendingAvatars.end()) {
sendIdentityRequest(pendingAvatar->avatar->getID());
qCDebug(avatars) << "Requesting identity for unknown avatar" << pendingAvatar->avatar->getID().toString();
pendingAvatar = _pendingAvatars.erase(pendingAvatar);
if (pendingAvatar == _pendingAvatars.end()) {
break;
}
}

View file

@ -134,7 +134,7 @@ AvatarSharedPointer AvatarHashMap::parseAvatarData(QSharedPointer<ReceivedMessag
auto avatar = newOrExistingAvatar(sessionUUID, sendingNode, isNewAvatar);
if (isNewAvatar) {
QWriteLocker locker(&_hashLock);
_pendingAvatars.insert(sessionUUID, avatar);
_pendingAvatars.insert(sessionUUID, { usecTimestampNow(), avatar });
}
// have the matching (or new) avatar parse the data from the packet

View file

@ -153,7 +153,12 @@ protected:
virtual void handleRemovedAvatar(const AvatarSharedPointer& removedAvatar, KillAvatarReason removalReason = KillAvatarReason::NoReason);
AvatarHash _avatarHash;
AvatarHash _pendingAvatars;
struct PendingAvatar {
quint64 creationTime;
AvatarSharedPointer avatar;
};
using AvatarPendingHash = QHash<QUuid, PendingAvatar>;
AvatarPendingHash _pendingAvatars;
mutable QReadWriteLock _hashLock;
private: