leverage COW for AvatarHash

This commit is contained in:
Stephen Birarda 2015-11-19 15:43:29 -08:00
parent 5140a480a1
commit 6398a922c6
4 changed files with 9 additions and 17 deletions

View file

@ -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);

View file

@ -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();

View file

@ -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) {

View file

@ -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: