From 3546bab19a8a28f1ee43357270c9a6bad9695ca9 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 18 Oct 2019 10:13:56 -0700 Subject: [PATCH] use std::vector<> instead of QVector<> --- interface/src/avatar/MyAvatar.cpp | 5 ++-- interface/src/avatar/OtherAvatar.cpp | 21 ++++++++------ .../src/avatars-renderer/Avatar.cpp | 8 +++-- libraries/entities/src/EntityTree.cpp | 29 ++++++++++++------- libraries/entities/src/EntityTree.h | 2 +- tests/octree/src/ModelTests.cpp | 5 ++-- 6 files changed, 44 insertions(+), 26 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 5c10e05806..667c315121 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -1589,14 +1589,15 @@ void MyAvatar::handleChangedAvatarEntityData() { // move the lists to minimize lock time std::vector cachedBlobsToDelete; std::vector cachedBlobsToUpdate; - QSet idsToDelete; + std::vector idsToDelete; + idsToDelete.reserve(_entitiesToDelete.size()); std::vector entitiesToAdd; std::vector entitiesToUpdate; _avatarEntitiesLock.withWriteLock([&] { cachedBlobsToDelete = std::move(_cachedAvatarEntityBlobsToDelete); cachedBlobsToUpdate = std::move(_cachedAvatarEntityBlobsToAddOrUpdate); foreach (auto id, _entitiesToDelete) { - idsToDelete.insert(id); + idsToDelete.push_back(id); } _entitiesToDelete.clear(); entitiesToAdd = std::move(_entitiesToAdd); diff --git a/interface/src/avatar/OtherAvatar.cpp b/interface/src/avatar/OtherAvatar.cpp index 43d1ddeaad..aa6c074d08 100755 --- a/interface/src/avatar/OtherAvatar.cpp +++ b/interface/src/avatar/OtherAvatar.cpp @@ -561,16 +561,19 @@ void OtherAvatar::handleChangedAvatarEntityData() { _avatarEntitiesLock.withReadLock([&] { packedAvatarEntityData = _packedAvatarEntityData; }); - QSet idsToDelete; - foreach (auto entityID, recentlyRemovedAvatarEntities) { - if (!packedAvatarEntityData.contains(entityID)) { - idsToDelete.insert(entityID); + if (!recentlyRemovedAvatarEntities.empty()) { + std::vector idsToDelete; + idsToDelete.reserve(recentlyRemovedAvatarEntities.size()); + foreach (auto entityID, recentlyRemovedAvatarEntities) { + if (!packedAvatarEntityData.contains(entityID)) { + idsToDelete.push_back(entityID); + } + } + if (!idsToDelete.empty()) { + bool force = true; + bool ignoreWarnings = true; + entityTree->deleteEntitiesByID(idsToDelete, force, ignoreWarnings); } - } - if (!idsToDelete.empty()) { - bool force = true; - bool ignoreWarnings = true; - entityTree->deleteEntitiesByID(idsToDelete, force, ignoreWarnings); } // TODO: move this outside of tree lock diff --git a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp index 6f0fef40d2..01cc86f8b5 100644 --- a/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp +++ b/libraries/avatars-renderer/src/avatars-renderer/Avatar.cpp @@ -333,6 +333,9 @@ void Avatar::setTargetScale(float targetScale) { } void Avatar::removeAvatarEntitiesFromTree() { + if (_packedAvatarEntityData.empty()) { + return; + } auto treeRenderer = DependencyManager::get(); EntityTreePointer entityTree = treeRenderer ? treeRenderer->getTree() : nullptr; if (entityTree) { @@ -340,9 +343,10 @@ void Avatar::removeAvatarEntitiesFromTree() { _avatarEntitiesLock.withReadLock([&] { avatarEntityIDs = _packedAvatarEntityData.keys(); }); - QSet ids; + std::vector ids; + ids.reserve(avatarEntityIDs.size()); foreach (auto id, avatarEntityIDs) { - ids.insert(id); + ids.push_back(id); } bool force = true; bool ignoreWarnings = true; diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index dc94024804..cad25aa61e 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -609,8 +609,8 @@ void EntityTree::setSimulation(EntitySimulationPointer simulation) { void EntityTree::deleteEntity(const EntityItemID& entityID, bool force, bool ignoreWarnings) { // NOTE: can be called without lock because deleteEntitiesByID() will lock - QSet ids; - ids << entityID; + std::vector ids; + ids.push_back(entityID); deleteEntitiesByID(ids, force, ignoreWarnings); } @@ -674,7 +674,7 @@ void EntityTree::recursivelyFilterAndCollectForDelete(const EntityItemPointer& e } } -void EntityTree::deleteEntitiesByID(const QSet& ids, bool force, bool ignoreWarnings) { +void EntityTree::deleteEntitiesByID(const std::vector& ids, bool force, bool ignoreWarnings) { // this method has two paths: // (a) entity-server: applies delete filter // (b) interface-client: deletes local- and my-avatar-entities immediately, submits domainEntity deletes to the entity-server @@ -2230,11 +2230,19 @@ void EntityTree::fixupNeedsParentFixups() { } void EntityTree::deleteDescendantsOfAvatar(QUuid avatarID) { - if (_childrenOfAvatars.contains(avatarID)) { - bool force = true; - bool ignoreWarnings = true; - deleteEntitiesByID(_childrenOfAvatars[avatarID], force, ignoreWarnings); - _childrenOfAvatars.remove(avatarID); + QHash>::const_iterator itr = _childrenOfAvatars.constFind(avatarID); + if (itr != _childrenOfAvatars.end()) { + if (!itr.value().empty()) { + std::vector ids; + ids.reserve(itr.value().size()); + for (const auto id : itr.value()) { + ids.push_back(id); + } + bool force = true; + bool ignoreWarnings = true; + deleteEntitiesByID(ids, force, ignoreWarnings); + } + _childrenOfAvatars.erase(itr); } } @@ -2436,7 +2444,8 @@ int EntityTree::processEraseMessageDetails(const QByteArray& dataByteArray, cons processedBytes += sizeof(numberOfIds); if (numberOfIds > 0) { - QSet ids; + std::vector ids; + ids.reserve(numberOfIds); // extract ids from packet for (size_t i = 0; i < numberOfIds; i++) { @@ -2454,7 +2463,7 @@ int EntityTree::processEraseMessageDetails(const QByteArray& dataByteArray, cons #endif EntityItemID entityID(id); - ids << entityID; + ids.push_back(entityID); } bool force = sourceNode->isAllowedEditor(); diff --git a/libraries/entities/src/EntityTree.h b/libraries/entities/src/EntityTree.h index 6574b9d601..dc26b0a9ce 100644 --- a/libraries/entities/src/EntityTree.h +++ b/libraries/entities/src/EntityTree.h @@ -127,7 +127,7 @@ public: void cleanupCloneIDs(const EntityItemID& entityID); void deleteEntity(const EntityItemID& entityID, bool force = false, bool ignoreWarnings = true); - void deleteEntitiesByID(const QSet& entityIDs, bool force = false, bool ignoreWarnings = true); + void deleteEntitiesByID(const std::vector& entityIDs, bool force = false, bool ignoreWarnings = true); void deleteEntitiesByPointer(const SetOfEntities& entities); EntityItemPointer findEntityByID(const QUuid& id) const; diff --git a/tests/octree/src/ModelTests.cpp b/tests/octree/src/ModelTests.cpp index 1ab32217d9..0b812c1de7 100644 --- a/tests/octree/src/ModelTests.cpp +++ b/tests/octree/src/ModelTests.cpp @@ -434,12 +434,13 @@ void EntityTests::entityTreeTests(bool verbose) { quint64 totalElapsedFind = 0; for (int i = 0; i < TEST_ITERATIONS; i++) { - QSet entitiesToDelete; + std::vector entitiesToDelete; + entitiesToDelete.reserve(ENTITIES_PER_ITERATION); for (int j = 0; j < ENTITIES_PER_ITERATION; j++) { //uint32_t id = 2 + (i * ENTITIES_PER_ITERATION) + j; // These are the entities we added above QUuid id = QUuid::createUuid();// make sure it doesn't collide with previous entity ids EntityItemID entityID(id); - entitiesToDelete << entityID; + entitiesToDelete.push_back(entityID); } if (extraVerbose) {