[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