perform avatar entity cleanup in AvatarManager::handleRemovedAvatar

This commit is contained in:
Stephen Birarda 2018-09-12 12:30:15 -07:00
parent 1789d51d6e
commit b1f44d2ad7
3 changed files with 19 additions and 11 deletions

View file

@ -443,6 +443,11 @@ void AvatarManager::handleRemovedAvatar(const AvatarSharedPointer& removedAvatar
avatar->die(); avatar->die();
queuePhysicsChange(avatar); queuePhysicsChange(avatar);
// remove this avatar's entities from the tree now, if we wait (as we did previously) for this Avatar's destructor
// it might not fire until after we create a new instance for the same remote avatar, which creates a race
// on the creation of entities for that avatar instance and the deletion of entities for this instance
avatar->removeAvatarEntitiesFromTree();
if (removalReason == KillAvatarReason::TheirAvatarEnteredYourBubble) { if (removalReason == KillAvatarReason::TheirAvatarEnteredYourBubble) {
emit DependencyManager::get<UsersScriptingInterface>()->enteredIgnoreRadius(); emit DependencyManager::get<UsersScriptingInterface>()->enteredIgnoreRadius();
} else if (removalReason == KillAvatarReason::AvatarDisconnected) { } else if (removalReason == KillAvatarReason::AvatarDisconnected) {

View file

@ -131,17 +131,6 @@ Avatar::Avatar(QThread* thread) :
} }
Avatar::~Avatar() { Avatar::~Avatar() {
auto treeRenderer = DependencyManager::get<EntityTreeRenderer>();
EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr;
if (entityTree) {
entityTree->withWriteLock([&] {
AvatarEntityMap avatarEntities = getAvatarEntityData();
for (auto entityID : avatarEntities.keys()) {
entityTree->deleteEntity(entityID, true, true);
}
});
}
auto geometryCache = DependencyManager::get<GeometryCache>(); auto geometryCache = DependencyManager::get<GeometryCache>();
if (geometryCache) { if (geometryCache) {
geometryCache->releaseID(_nameRectGeometryID); geometryCache->releaseID(_nameRectGeometryID);
@ -386,6 +375,19 @@ void Avatar::updateAvatarEntities() {
setAvatarEntityDataChanged(false); setAvatarEntityDataChanged(false);
} }
void Avatar::removeAvatarEntitiesFromTree() {
auto treeRenderer = DependencyManager::get<EntityTreeRenderer>();
EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr;
if (entityTree) {
entityTree->withWriteLock([&] {
AvatarEntityMap avatarEntities = getAvatarEntityData();
for (auto entityID : avatarEntities.keys()) {
entityTree->deleteEntity(entityID, true, true);
}
});
}
}
void Avatar::relayJointDataToChildren() { void Avatar::relayJointDataToChildren() {
forEachChild([&](SpatiallyNestablePointer child) { forEachChild([&](SpatiallyNestablePointer child) {
if (child->getNestableType() == NestableType::Entity) { if (child->getNestableType() == NestableType::Entity) {

View file

@ -73,6 +73,7 @@ public:
void init(); void init();
void updateAvatarEntities(); void updateAvatarEntities();
void removeAvatarEntitiesFromTree();
void simulate(float deltaTime, bool inView); void simulate(float deltaTime, bool inView);
virtual void simulateAttachments(float deltaTime); virtual void simulateAttachments(float deltaTime);