[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [59484] trunk/blender/source/blender: ghash: reserve size when its known or can be guessed close enough.
Campbell Barton
ideasman42 at gmail.com
Sat Aug 24 19:33:47 CEST 2013
Revision: 59484
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=59484
Author: campbellbarton
Date: 2013-08-24 17:33:47 +0000 (Sat, 24 Aug 2013)
Log Message:
-----------
ghash: reserve size when its known or can be guessed close enough.
also avoid allocs per node in pbvh_bmesh_node_limit_ensure()
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/object_deform.c
trunk/blender/source/blender/blenkernel/intern/pbvh.c
trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
trunk/blender/source/blender/blenkernel/intern/treehash.c
trunk/blender/source/blender/bmesh/intern/bmesh_log.c
trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c
trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
trunk/blender/source/blender/editors/curve/editcurve.c
trunk/blender/source/blender/editors/mesh/meshtools.c
trunk/blender/source/blender/makesdna/intern/dna_genfile.c
trunk/blender/source/blender/windowmanager/intern/wm.c
trunk/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: trunk/blender/source/blender/blenkernel/intern/object_deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object_deform.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/blenkernel/intern/object_deform.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -79,7 +79,7 @@
return NULL;
}
- gh = BLI_ghash_str_new("BKE_objdef_validmap_get gh");
+ gh = BLI_ghash_str_new_ex("BKE_objdef_validmap_get gh", defbase_tot);
/* add all names to a hash table */
for (dg = ob->defbase.first; dg; dg = dg->next) {
Modified: trunk/blender/source/blender/blenkernel/intern/pbvh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -277,11 +277,12 @@
GHash *map;
int i, j, totface;
- map = BLI_ghash_int_new("build_mesh_leaf_node gh");
-
node->uniq_verts = node->face_verts = 0;
totface = node->totprim;
+ /* reserve size is rough guess */
+ map = BLI_ghash_int_new_ex("build_mesh_leaf_node gh", 2 * totface);
+
node->face_vert_indices = MEM_callocN(sizeof(int) * 4 * totface,
"bvh node face vert indices");
Modified: trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/blenkernel/intern/pbvh_bmesh.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -140,8 +140,8 @@
c2 = &bvh->nodes[children + 1];
c1->flag |= PBVH_Leaf;
c2->flag |= PBVH_Leaf;
- c1->bm_faces = BLI_ghash_ptr_new("bm_faces");
- c2->bm_faces = BLI_ghash_ptr_new("bm_faces");
+ c1->bm_faces = BLI_ghash_ptr_new_ex("bm_faces", BLI_ghash_size(n->bm_faces) / 2);
+ c2->bm_faces = BLI_ghash_ptr_new_ex("bm_faces", BLI_ghash_size(n->bm_faces) / 2);
/* Partition the parent node's faces between the two children */
GHASH_ITER (gh_iter, n->bm_faces) {
@@ -227,19 +227,26 @@
static int pbvh_bmesh_node_limit_ensure(PBVH *bvh, int node_index)
{
GHash *prim_bbc;
+ GHash *bm_faces;
+ int bm_faces_size;
GHashIterator gh_iter;
+ BBC *bbc_array;
+ unsigned int i;
- if (BLI_ghash_size(bvh->nodes[node_index].bm_faces) <= bvh->leaf_limit) {
+ bm_faces = bvh->nodes[node_index].bm_faces;
+ bm_faces_size = BLI_ghash_size(bm_faces);
+ if (bm_faces_size <= bvh->leaf_limit) {
/* Node limit not exceeded */
return FALSE;
}
/* For each BMFace, store the AABB and AABB centroid */
- prim_bbc = BLI_ghash_ptr_new("prim_bbc");
+ prim_bbc = BLI_ghash_ptr_new_ex("prim_bbc", bm_faces_size);
+ bbc_array = MEM_callocN(sizeof(BBC) * bm_faces_size, "BBC");
- GHASH_ITER (gh_iter, bvh->nodes[node_index].bm_faces) {
+ GHASH_ITER_INDEX (gh_iter, bm_faces, i) {
BMFace *f = BLI_ghashIterator_getKey(&gh_iter);
- BBC *bbc = MEM_callocN(sizeof(BBC), "BBC");
+ BBC *bbc = &bbc_array[i];
BMLoop *l_iter;
BMLoop *l_first;
@@ -255,7 +262,8 @@
pbvh_bmesh_node_split(bvh, prim_bbc, node_index);
- BLI_ghash_free(prim_bbc, NULL, MEM_freeN);
+ BLI_ghash_free(prim_bbc, NULL, NULL);
+ MEM_freeN(bbc_array);
return TRUE;
}
@@ -1071,7 +1079,7 @@
n = bvh->nodes = MEM_callocN(sizeof(PBVHNode), "PBVHNode");
bvh->totnode = 1;
n->flag = PBVH_Leaf;
- n->bm_faces = BLI_ghash_ptr_new("bm_faces");
+ n->bm_faces = BLI_ghash_ptr_new_ex("bm_faces", bvh->bm->totface);
BM_ITER_MESH (f, &iter, bvh->bm, BM_FACES_OF_MESH) {
BLI_ghash_insert(n->bm_faces, f, NULL);
}
Modified: trunk/blender/source/blender/blenkernel/intern/treehash.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/treehash.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/blenkernel/intern/treehash.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -102,7 +102,7 @@
void *BKE_treehash_create_from_treestore(BLI_mempool *treestore)
{
- GHash *treehash = BLI_ghash_new(tse_hash, tse_cmp, "treehash");
+ GHash *treehash = BLI_ghash_new_ex(tse_hash, tse_cmp, "treehash", BLI_mempool_count(treestore));
fill_treehash(treehash, treestore);
return treehash;
}
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_log.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_log.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_log.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -407,7 +407,7 @@
*/
static GHash *bm_log_compress_ids_to_indices(unsigned int *ids, int totid)
{
- GHash *map = BLI_ghash_int_new(AT);
+ GHash *map = BLI_ghash_int_new_ex(AT, totid);
int i;
qsort(ids, totid, sizeof(*ids), uint_compare);
@@ -441,8 +441,8 @@
BMLog *log = MEM_callocN(sizeof(*log), AT);
log->unused_ids = range_tree_uint_alloc(0, (unsigned)-1);
- log->id_to_elem = BLI_ghash_ptr_new(AT);
- log->elem_to_id = BLI_ghash_ptr_new(AT);
+ log->id_to_elem = BLI_ghash_ptr_new_ex(AT, bm->totvert + bm->totface);
+ log->elem_to_id = BLI_ghash_ptr_new_ex(AT, bm->totvert + bm->totface);
/* Assign IDs to all existing vertices and faces */
bm_log_assign_ids(bm, log);
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_mesh.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -674,7 +674,7 @@
int *new_idx = NULL;
/* Init the old-to-new vert pointers mapping */
- vptr_map = BLI_ghash_ptr_new("BM_mesh_remap vert pointers mapping");
+ vptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap vert pointers mapping", bm->totvert);
/* Make a copy of all vertices. */
verts_pool = MEM_callocN(sizeof(BMVert *) * totvert, "BM_mesh_remap verts pool");
@@ -708,7 +708,7 @@
int *new_idx = NULL;
/* Init the old-to-new vert pointers mapping */
- eptr_map = BLI_ghash_ptr_new("BM_mesh_remap edge pointers mapping");
+ eptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap edge pointers mapping", bm->totedge);
/* Make a copy of all vertices. */
edges_pool = MEM_callocN(sizeof(BMEdge *) * totedge, "BM_mesh_remap edges pool");
@@ -741,7 +741,7 @@
int *new_idx = NULL;
/* Init the old-to-new vert pointers mapping */
- fptr_map = BLI_ghash_ptr_new("BM_mesh_remap face pointers mapping");
+ fptr_map = BLI_ghash_ptr_new_ex("BM_mesh_remap face pointers mapping", bm->totface);
/* Make a copy of all vertices. */
faces_pool = MEM_callocN(sizeof(BMFace *) * totface, "BM_mesh_remap faces pool");
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -341,7 +341,7 @@
}
if (!slot_dst->data.ghash) {
- slot_dst->data.ghash = BLI_ghash_ptr_new("bmesh operator 2");
+ slot_dst->data.ghash = BLI_ghash_ptr_new_ex("bmesh operator 2", BLI_ghash_size(slot_src->data.ghash));
}
for (BLI_ghashIterator_init(&it, slot_src->data.ghash);
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -87,8 +87,8 @@
walker->mask_edge = mask_edge;
walker->mask_face = mask_face;
- walker->visithash = BLI_ghash_ptr_new("bmesh walkers 1");
- walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec 1");
+ walker->visithash = BLI_ghash_ptr_new("bmesh walkers");
+ walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec");
if (UNLIKELY(type >= BMW_MAXWALKERS || type < 0)) {
fprintf(stderr,
@@ -253,8 +253,6 @@
BMW_state_remove(walker);
}
walker->depth = 0;
- BLI_ghash_free(walker->visithash, NULL, NULL);
- BLI_ghash_free(walker->secvisithash, NULL, NULL);
- walker->visithash = BLI_ghash_ptr_new("bmesh walkers 1");
- walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers sec 1");
+ BLI_ghash_clear(walker->visithash, NULL, NULL);
+ BLI_ghash_clear(walker->secvisithash, NULL, NULL);
}
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c 2013-08-24 17:25:12 UTC (rev 59483)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_walkers_impl.c 2013-08-24 17:33:47 UTC (rev 59484)
@@ -494,8 +494,7 @@
lwalk->lastv = lwalk->startv = BM_edge_other_vert(owalk.cur, lwalk->lastv);
- BLI_ghash_free(walker->visithash, NULL, NULL);
- walker->visithash = BLI_ghash_ptr_new("bmesh walkers 2");
+ BLI_ghash_clear(walker->visithash, NULL, NULL);
BLI_ghash_insert(walker->visithash, owalk.cur, NULL);
}
@@ -751,12 +750,10 @@
*lwalk = owalk;
lwalk->no_calc = false;
- BLI_ghash_free(walker->secvisithash, NULL, NULL);
- walker->secvisithash = BLI_ghash_ptr_new("bmesh walkers 3");
+ BLI_ghash_clear(walker->secvisithash, NULL, NULL);
BLI_ghash_insert(walker->secvisithash, lwalk->l->e, NULL);
- BLI_ghash_free(walker->visithash, NULL, NULL);
- walker->visithash = BLI_ghash_ptr_new("bmesh walkers 3");
+ BLI_ghash_clear(walker->visithash, NULL, NULL);
BLI_ghash_insert(walker->visithash, lwalk->l->f, NULL);
}
@@ -806,8 +803,9 @@
lwalk->no_calc = false;
}
- BLI_ghash_insert(walker->secvisithash, l->e, NULL);
- BLI_ghash_insert(walker->visithash, l->f, NULL);
+ /* both may already exist */
+ BLI_ghash_reinsert(walker->secvisithash, l->e, NULL, NULL, NULL);
+ BLI_ghash_reinsert(walker->visithash, l->f, NULL, NULL, NULL);
}
return f;
@@ -858,8 +856,7 @@
lwalk->l = lwalk->l->radial_next;
}
- BLI_ghash_free(walker->visithash, NULL, NULL);
- walker->visithash = BLI_ghash_ptr_new("bmesh walkers 4");
+ BLI_ghash_clear(walker->visithash, NULL, NULL);
BLI_ghash_insert(walker->visithash, lwalk->l->e, NULL);
}
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list