[Bf-blender-cvs] [85e51b0] master: Avoid driver target remapping when freeing the whole database
Sergey Sharybin
noreply at git.blender.org
Tue Nov 15 15:56:43 CET 2016
Commit: 85e51b063854d81b486d7099536bc21404fc627e
Author: Sergey Sharybin
Date: Tue Nov 15 15:38:03 2016 +0100
Branches: master
https://developer.blender.org/rB85e51b063854d81b486d7099536bc21404fc627e
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).
===================================================================
M source/blender/blenkernel/BKE_library.h
M source/blender/blenkernel/intern/library_remap.c
===================================================================
diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h
index 1cc7014..39e8d71 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 b468e64..4262972 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);
More information about the Bf-blender-cvs
mailing list