diff options
author | Campbell Barton <ideasman42@gmail.com> | 2013-08-24 21:33:47 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2013-08-24 21:33:47 +0400 |
commit | 09a52f18b6d8bd77cbffd746f72e866e1740505f (patch) | |
tree | 525d2cd2121cd5e7112bcb26ffcca0445d979328 /source/blender/blenkernel | |
parent | 7bd422143e2ebab4f37fd8647206ec5d2235259e (diff) |
ghash: reserve size when its known or can be guessed close enough.
also avoid allocs per node in pbvh_bmesh_node_limit_ensure()
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/object_deform.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh.c | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh_bmesh.c | 24 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/treehash.c | 2 |
4 files changed, 21 insertions, 12 deletions
diff --git a/source/blender/blenkernel/intern/object_deform.c b/source/blender/blenkernel/intern/object_deform.c index 9cb7c91decd..77c5e57f382 100644 --- a/source/blender/blenkernel/intern/object_deform.c +++ b/source/blender/blenkernel/intern/object_deform.c @@ -79,7 +79,7 @@ bool *BKE_objdef_validmap_get(Object *ob, const int defbase_tot) 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) { diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index 3907f4d8082..df227b6accb 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -277,11 +277,12 @@ static void build_mesh_leaf_node(PBVH *bvh, PBVHNode *node) 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"); diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c index 5aae6276a79..455ffd90ada 100644 --- a/source/blender/blenkernel/intern/pbvh_bmesh.c +++ b/source/blender/blenkernel/intern/pbvh_bmesh.c @@ -140,8 +140,8 @@ static void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index) 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 void pbvh_bmesh_node_split(PBVH *bvh, GHash *prim_bbc, int node_index) 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 @@ static int pbvh_bmesh_node_limit_ensure(PBVH *bvh, int node_index) 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 @@ void BKE_pbvh_build_bmesh(PBVH *bvh, BMesh *bm, int smooth_shading, 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); } diff --git a/source/blender/blenkernel/intern/treehash.c b/source/blender/blenkernel/intern/treehash.c index 19a9ede31ea..3258bb47fc1 100644 --- a/source/blender/blenkernel/intern/treehash.c +++ b/source/blender/blenkernel/intern/treehash.c @@ -102,7 +102,7 @@ static void fill_treehash(void *treehash, BLI_mempool *treestore) 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; } |