From 77d02c5e2b043b5836b8dda8ec63c3bb092df848 Mon Sep 17 00:00:00 2001 From: frutiemax Date: Fri, 17 Jul 2020 00:25:35 -0400 Subject: [PATCH] Close #12290: Refactor of object_manager_unload_objects (#12291) --- src/openrct2/EditorObjectSelectionSession.cpp | 7 ++----- src/openrct2/object/ObjectManager.cpp | 11 +++++------ src/openrct2/object/ObjectManager.h | 4 ++-- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/openrct2/EditorObjectSelectionSession.cpp b/src/openrct2/EditorObjectSelectionSession.cpp index ba5ce432ff..8cbcb1f605 100644 --- a/src/openrct2/EditorObjectSelectionSession.cpp +++ b/src/openrct2/EditorObjectSelectionSession.cpp @@ -319,8 +319,6 @@ void unload_unselected_objects() { int32_t numItems = static_cast(object_repository_get_items_count()); const ObjectRepositoryItem* items = object_repository_get_items(); - - size_t numObjectsToUnload = 0; std::vector objectsToUnload; for (int32_t i = 0; i < numItems; i++) @@ -330,11 +328,10 @@ void unload_unselected_objects() const rct_object_entry* entry = &items[i].ObjectEntry; remove_selected_objects_from_research(entry); - objectsToUnload[numObjectsToUnload++] = *entry; + objectsToUnload.push_back(*entry); } } - - object_manager_unload_objects(objectsToUnload, numObjectsToUnload); + object_manager_unload_objects(objectsToUnload); } /** diff --git a/src/openrct2/object/ObjectManager.cpp b/src/openrct2/object/ObjectManager.cpp index 21dc9984b4..11dd4ac35c 100644 --- a/src/openrct2/object/ObjectManager.cpp +++ b/src/openrct2/object/ObjectManager.cpp @@ -147,17 +147,16 @@ public: log_verbose("%u / %u new objects loaded", numNewLoadedObjects, requiredObjects.size()); } - void UnloadObjects(const std::vector& entries, size_t count) override + void UnloadObjects(const std::vector& entries) override { // TODO there are two performance issues here: // - FindObject for every entry which is a dictionary lookup // - GetLoadedObjectIndex for every entry which enumerates _loadedList size_t numObjectsUnloaded = 0; - for (size_t i = 0; i < count; i++) + for (const auto& entry : entries) { - const rct_object_entry* entry = &entries[i]; - const ObjectRepositoryItem* ori = _objectRepository.FindObject(entry); + const ObjectRepositoryItem* ori = _objectRepository.FindObject(&entry); if (ori != nullptr) { Object* loadedObject = ori->LoadedObject; @@ -747,10 +746,10 @@ void* object_manager_load_object(const rct_object_entry* entry) return static_cast(loadedObject); } -void object_manager_unload_objects(const std::vector& entries, size_t count) +void object_manager_unload_objects(const std::vector& entries) { auto& objectManager = OpenRCT2::GetContext()->GetObjectManager(); - objectManager.UnloadObjects(entries, count); + objectManager.UnloadObjects(entries); } void object_manager_unload_all_objects() diff --git a/src/openrct2/object/ObjectManager.h b/src/openrct2/object/ObjectManager.h index d2a52717b2..02cbb8567f 100644 --- a/src/openrct2/object/ObjectManager.h +++ b/src/openrct2/object/ObjectManager.h @@ -33,7 +33,7 @@ interface IObjectManager virtual Object* LoadObject(const rct_object_entry* entry) abstract; virtual void LoadObjects(const rct_object_entry* entries, size_t count) abstract; virtual void LoadDefaultObjects() abstract; - virtual void UnloadObjects(const std::vector& entries, size_t count) abstract; + virtual void UnloadObjects(const std::vector& entries) abstract; virtual void UnloadAll() abstract; virtual void ResetObjects() abstract; @@ -48,6 +48,6 @@ void* object_manager_get_loaded_object_by_index(size_t index); void* object_manager_get_loaded_object(const rct_object_entry* entry); ObjectEntryIndex object_manager_get_loaded_object_entry_index(const void* loadedObject); void* object_manager_load_object(const rct_object_entry* entry); -void object_manager_unload_objects(const std::vector& entries, size_t count); +void object_manager_unload_objects(const std::vector& entries); void object_manager_unload_all_objects(); rct_string_id object_manager_get_source_game_string(const uint8_t sourceGame);