mirror of
https://github.com/overte-org/overte.git
synced 2025-08-11 09:48:27 +02:00
leverage COW for AvatarHash
This commit is contained in:
parent
5140a480a1
commit
6398a922c6
4 changed files with 9 additions and 17 deletions
|
@ -119,10 +119,10 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
|
||||||
PerformanceTimer perfTimer("otherAvatars");
|
PerformanceTimer perfTimer("otherAvatars");
|
||||||
|
|
||||||
// simulate avatars
|
// simulate avatars
|
||||||
QWriteLocker writeLock(&_hashLock);
|
auto hashCopy = _avatarHash;
|
||||||
|
|
||||||
AvatarHash::iterator avatarIterator = _avatarHash.begin();
|
AvatarHash::iterator avatarIterator = hashCopy.begin();
|
||||||
while (avatarIterator != _avatarHash.end()) {
|
while (avatarIterator != hashCopy.end()) {
|
||||||
auto avatar = std::dynamic_pointer_cast<Avatar>(avatarIterator.value());
|
auto avatar = std::dynamic_pointer_cast<Avatar>(avatarIterator.value());
|
||||||
|
|
||||||
if (avatar == _myAvatar || !avatar->isInitialized()) {
|
if (avatar == _myAvatar || !avatar->isInitialized()) {
|
||||||
|
@ -130,9 +130,8 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
|
||||||
// DO NOT update or fade out uninitialized Avatars
|
// DO NOT update or fade out uninitialized Avatars
|
||||||
++avatarIterator;
|
++avatarIterator;
|
||||||
} else if (avatar->shouldDie()) {
|
} else if (avatar->shouldDie()) {
|
||||||
auto removedAvatar = avatarIterator.value();
|
removeAvatar(avatarIterator.key());
|
||||||
avatarIterator = _avatarHash.erase(avatarIterator);
|
++avatarIterator;
|
||||||
handleRemovedAvatar(removedAvatar);
|
|
||||||
} else {
|
} else {
|
||||||
avatar->startUpdate();
|
avatar->startUpdate();
|
||||||
avatar->simulate(deltaTime);
|
avatar->simulate(deltaTime);
|
||||||
|
@ -140,8 +139,6 @@ void AvatarManager::updateOtherAvatars(float deltaTime) {
|
||||||
++avatarIterator;
|
++avatarIterator;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
writeLock.unlock();
|
|
||||||
|
|
||||||
// simulate avatar fades
|
// simulate avatar fades
|
||||||
simulateAvatarFades(deltaTime);
|
simulateAvatarFades(deltaTime);
|
||||||
|
@ -329,6 +326,7 @@ void AvatarManager::handleCollisionEvents(const CollisionEvents& collisionEvents
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarManager::updateAvatarPhysicsShape(Avatar* avatar) {
|
void AvatarManager::updateAvatarPhysicsShape(Avatar* avatar) {
|
||||||
|
qDebug() << "Update physics state called for" << avatar;
|
||||||
AvatarMotionState* motionState = avatar->getMotionState();
|
AvatarMotionState* motionState = avatar->getMotionState();
|
||||||
if (motionState) {
|
if (motionState) {
|
||||||
motionState->addDirtyFlags(Simulation::DIRTY_SHAPE);
|
motionState->addDirtyFlags(Simulation::DIRTY_SHAPE);
|
||||||
|
|
|
@ -982,10 +982,8 @@ void MyAvatar::updateLookAtTargetAvatar() {
|
||||||
const float KEEP_LOOKING_AT_CURRENT_ANGLE_FACTOR = 1.3f;
|
const float KEEP_LOOKING_AT_CURRENT_ANGLE_FACTOR = 1.3f;
|
||||||
const float GREATEST_LOOKING_AT_DISTANCE = 10.0f;
|
const float GREATEST_LOOKING_AT_DISTANCE = 10.0f;
|
||||||
|
|
||||||
AvatarHash hash;
|
AvatarHash hash = DependencyManager::get<AvatarManager>()->getCopy();
|
||||||
DependencyManager::get<AvatarManager>()->withAvatarHash([&] (const AvatarHash& locked) {
|
|
||||||
hash = locked; // make a shallow copy and operate on that, to minimize lock time
|
|
||||||
});
|
|
||||||
foreach (const AvatarSharedPointer& avatarPointer, hash) {
|
foreach (const AvatarSharedPointer& avatarPointer, hash) {
|
||||||
auto avatar = static_pointer_cast<Avatar>(avatarPointer);
|
auto avatar = static_pointer_cast<Avatar>(avatarPointer);
|
||||||
bool isCurrentTarget = avatar->getIsLookAtTarget();
|
bool isCurrentTarget = avatar->getIsLookAtTarget();
|
||||||
|
|
|
@ -22,10 +22,6 @@ AvatarHashMap::AvatarHashMap() {
|
||||||
connect(DependencyManager::get<NodeList>().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged);
|
connect(DependencyManager::get<NodeList>().data(), &NodeList::uuidChanged, this, &AvatarHashMap::sessionUUIDChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AvatarHashMap::withAvatarHash(std::function<void(const AvatarHash& hash)> callback) {
|
|
||||||
QReadLocker locker(&_hashLock);
|
|
||||||
callback(_avatarHash);
|
|
||||||
}
|
|
||||||
bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) {
|
bool AvatarHashMap::isAvatarInRange(const glm::vec3& position, const float range) {
|
||||||
QReadLocker locker(&_hashLock);
|
QReadLocker locker(&_hashLock);
|
||||||
foreach(const AvatarSharedPointer& sharedAvatar, _avatarHash) {
|
foreach(const AvatarSharedPointer& sharedAvatar, _avatarHash) {
|
||||||
|
|
|
@ -31,7 +31,7 @@ class AvatarHashMap : public QObject, public Dependency {
|
||||||
SINGLETON_DEPENDENCY
|
SINGLETON_DEPENDENCY
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void withAvatarHash(std::function<void(const AvatarHash& hash)>);
|
AvatarHash getCopy() { return _avatarHash; }
|
||||||
int size() { return _avatarHash.size(); }
|
int size() { return _avatarHash.size(); }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
Loading…
Reference in a new issue