diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-11-15 17:38:03 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2016-11-15 17:56:40 +0300 |
commit | 85e51b063854d81b486d7099536bc21404fc627e (patch) | |
tree | fe5eb69e081b5c245a4b8619477039b7c21cfd77 | |
parent | 0cd1b5ef85142cc3dcd69acdd5dbfc42a622ee3b (diff) |
Avoid driver target remapping when freeing the whole database
Added BKE_libblock_free_data_ex() which takes special do_id_user
argument which basically indicates whether main database was already
taken care about not having "dead" pointers.
Gives about 40% speedup of main database free with quadbot scene
(3.4sec vs. 5.4 sec on quite powerful desktop).
-rw-r--r-- | source/blender/blenkernel/BKE_library.h | 1 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/library_remap.c | 15 |
2 files changed, 12 insertions, 4 deletions
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index 1cc7014765c..39e8d712630 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -68,6 +68,7 @@ void BKE_libblock_free(struct Main *bmain, void *idv) ATTR_NONNULL(); void BKE_libblock_free_ex(struct Main *bmain, void *idv, const bool do_id_user) ATTR_NONNULL(); void BKE_libblock_free_us(struct Main *bmain, void *idv) ATTR_NONNULL(); void BKE_libblock_free_data(struct Main *bmain, struct ID *id) ATTR_NONNULL(); +void BKE_libblock_free_data_ex(struct Main *bmain, struct ID *id, const bool do_id_user) ATTR_NONNULL(); void BKE_libblock_delete(struct Main *bmain, void *idv) ATTR_NONNULL(); void BKE_id_lib_local_paths(struct Main *bmain, struct Library *lib, struct ID *id); diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c index b468e6436c8..4262972e015 100644 --- a/source/blender/blenkernel/intern/library_remap.c +++ b/source/blender/blenkernel/intern/library_remap.c @@ -691,13 +691,20 @@ static void animdata_dtar_clear_cb(ID *UNUSED(id), AnimData *adt, void *userdata void BKE_libblock_free_data(Main *bmain, ID *id) { + BKE_libblock_free_data_ex(bmain, id, true); +} + +void BKE_libblock_free_data_ex(Main *bmain, ID *id, const bool do_id_user) +{ if (id->properties) { IDP_FreeProperty(id->properties); MEM_freeN(id->properties); } - - /* this ID may be a driver target! */ - BKE_animdata_main_cb(bmain, animdata_dtar_clear_cb, (void *)id); + + if (do_id_user) { + /* this ID may be a driver target! */ + BKE_animdata_main_cb(bmain, animdata_dtar_clear_cb, (void *)id); + } } /** @@ -840,7 +847,7 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, const bool do_id_user) BLI_remlink(lb, id); - BKE_libblock_free_data(bmain, id); + BKE_libblock_free_data_ex(bmain, id, do_id_user); BKE_main_unlock(bmain); MEM_freeN(id); |