Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-08-24 21:33:47 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-08-24 21:33:47 +0400
commit09a52f18b6d8bd77cbffd746f72e866e1740505f (patch)
tree525d2cd2121cd5e7112bcb26ffcca0445d979328 /source/blender/blenkernel
parent7bd422143e2ebab4f37fd8647206ec5d2235259e (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.c2
-rw-r--r--source/blender/blenkernel/intern/pbvh.c5
-rw-r--r--source/blender/blenkernel/intern/pbvh_bmesh.c24
-rw-r--r--source/blender/blenkernel/intern/treehash.c2
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;
}