[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53163] trunk/blender/source/blender: bmesh optimization: use BM_face_create() rather then BM_face_create_ngon() in BM_mesh_copy(), gives ~30% overall speedup in my tests.

Campbell Barton ideasman42 at gmail.com
Wed Dec 19 10:13:09 CET 2012


Revision: 53163
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53163
Author:   campbellbarton
Date:     2012-12-19 09:13:06 +0000 (Wed, 19 Dec 2012)
Log Message:
-----------
bmesh optimization: use BM_face_create() rather then BM_face_create_ngon() in BM_mesh_copy(), gives ~30% overall speedup in my tests.

Modified Paths:
--------------
    trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
    trunk/blender/source/blender/editors/interface/interface_icons.c

Modified: trunk/blender/source/blender/bmesh/intern/bmesh_construct.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-12-19 08:13:41 UTC (rev 53162)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_construct.c	2012-12-19 09:13:06 UTC (rev 53163)
@@ -816,6 +816,8 @@
 
 BMesh *BM_mesh_copy(BMesh *bm_old)
 {
+#define USE_FAST_FACE_COPY
+
 	BMesh *bm_new;
 	BMVert *v, *v2, **vtable = NULL;
 	BMEdge *e, *e2, **edges = NULL, **etable = NULL;
@@ -823,6 +825,10 @@
 	BLI_array_declare(edges);
 	BMLoop *l, /* *l2, */ **loops = NULL;
 	BLI_array_declare(loops);
+#ifdef USE_FAST_FACE_COPY
+	BMVert **verts = NULL;
+	BLI_array_declare(verts);
+#endif
 	BMFace *f, *f2, **ftable = NULL;
 	BMEditSelection *ese;
 	BMIter iter, liter;
@@ -890,12 +896,24 @@
 		BLI_array_grow_items(loops, f->len);
 		BLI_array_grow_items(edges, f->len);
 
+#ifdef USE_FAST_FACE_COPY
+		BLI_array_empty(verts);
+		BLI_array_grow_items(verts, f->len);
+#endif
+
 		l = BM_iter_new(&liter, bm_old, BM_LOOPS_OF_FACE, f);
 		for (j = 0; j < f->len; j++, l = BM_iter_step(&liter)) {
 			loops[j] = l;
 			edges[j] = etable[BM_elem_index_get(l->e)];
+
+#ifdef USE_FAST_FACE_COPY
+			verts[j] = vtable[BM_elem_index_get(l->v)];
+#endif
 		}
 
+#ifdef USE_FAST_FACE_COPY
+		f2 = BM_face_create(bm_new, verts, edges, f->len, BM_CREATE_SKIP_CD);
+#else
 		v = vtable[BM_elem_index_get(loops[0]->v)];
 		v2 = vtable[BM_elem_index_get(loops[1]->v)];
 
@@ -905,6 +923,8 @@
 		}
 
 		f2 = BM_face_create_ngon(bm_new, v, v2, edges, f->len, BM_CREATE_SKIP_CD);
+#endif
+
 		if (UNLIKELY(f2 == NULL)) {
 			continue;
 		}

Modified: trunk/blender/source/blender/editors/interface/interface_icons.c
===================================================================
--- trunk/blender/source/blender/editors/interface/interface_icons.c	2012-12-19 08:13:41 UTC (rev 53162)
+++ trunk/blender/source/blender/editors/interface/interface_icons.c	2012-12-19 09:13:06 UTC (rev 53163)
@@ -986,7 +986,7 @@
 	Icon *icon = NULL;
 	DrawInfo *di = NULL;
 	IconImage *iimg;
-	float fdraw_size = draw_size;
+	const float fdraw_size = (float)draw_size;
 	int w, h;
 	
 	icon = BKE_icon_get(icon_id);




More information about the Bf-blender-cvs mailing list