[Bf-blender-cvs] [91ea5336a53] fracture_modifier: removed some performance-deadly reallocs in remesher

Martin Felke noreply at git.blender.org
Wed Jan 10 04:10:16 CET 2018


Commit: 91ea5336a537f52187fad41e3e6a3267f16b5e40
Author: Martin Felke
Date:   Wed Jan 10 04:09:54 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB91ea5336a537f52187fad41e3e6a3267f16b5e40

removed some performance-deadly reallocs in remesher

remesher now atleast responds again to user input and runs with 0.6fps with 60^3 particles

===================================================================

M	source/blender/modifiers/intern/MOD_remesh.c

===================================================================

diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index 8338cbe0dd8..c23f853bf46 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -30,6 +30,7 @@
 #include "BLI_math_vector.h"
 #include "BLI_utildefines.h"
 #include "BLI_listbase.h"
+#include "BLI_memarena.h"
 
 #include "BKE_cdderivedmesh.h"
 #include "BKE_DerivedMesh.h"
@@ -155,7 +156,7 @@ static void dualcon_add_quad(void *output_v, const int vert_indices[4])
 }
 
 static int get_particle_positions_sizes_vel(RemeshModifierData *rmd, ParticleSystem *psys, Object *ob,
-                                        float (**pos)[3], float **size, float (**vel)[3])
+                                        float (**pos)[3], float **size, float (**vel)[3], MemArena *pardata)
 {
 	//take alive, for now
 	ParticleData *pa;
@@ -163,6 +164,10 @@ static int get_particle_positions_sizes_vel(RemeshModifierData *rmd, ParticleSys
 	float imat[4][4];
 	invert_m4_m4(imat, ob->obmat);
 
+	(*pos) = BLI_memarena_alloc(pardata, sizeof(float) * 3 * psys->totpart);
+	(*size) = BLI_memarena_alloc(pardata, sizeof(float) * psys->totpart);
+	(*vel) = BLI_memarena_calloc(pardata, sizeof(float) * 3 * psys->totpart);
+
 	for (i = 0; i < psys->totpart; i++)
 	{
 		float co[3];
@@ -172,25 +177,10 @@ static int get_particle_positions_sizes_vel(RemeshModifierData *rmd, ParticleSys
 		if (pa->alive == PARS_DEAD && (rmd->pflag & eRemeshFlag_Dead) == 0) continue;
 
 		mul_v3_m4v3(co, imat, pa->state.co);
-
-		if (j == 0) {
-			(*pos) = MEM_mallocN(sizeof(float) * 3, "part pos");
-			(*size) = MEM_mallocN(sizeof(float), "part size");
-			(*vel) = MEM_callocN(sizeof(float) * 3, "part vel");
-			copy_v3_v3((*pos)[0], co);
-			(*size)[0] = pa->size;
-			copy_v3_v3((*vel)[0], pa->state.vel);
-			j++;
-		}
-		else {
-			(*pos) = MEM_reallocN((*pos), sizeof(float) * 3 * (j+1));
-			(*size) = MEM_reallocN((*size), sizeof(float) * (j+1));
-			(*vel) = MEM_reallocN((*vel), sizeof(float) * 3 * (j+1));
-			copy_v3_v3((*pos)[j], co);
-			(*size)[j] = pa->size;
-			copy_v3_v3((*vel)[j], pa->state.vel);
-			j++;
-		}
+		copy_v3_v3((*pos)[j], co);
+		(*size)[j] = pa->size;
+		copy_v3_v3((*vel)[j], pa->state.vel);
+		j++;
 	}
 
 	return j;
@@ -244,11 +234,13 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 	if (((rmd->input & MOD_REMESH_VERTICES)==0) && (rmd->input & MOD_REMESH_PARTICLES))
 	{
 		//particles only
-
+		MemArena *pardata = NULL;
 		if (psys == NULL)
 			return derived;
 
-		n = get_particle_positions_sizes_vel(rmd, psys, ob, &pos, &size, &vel);
+		pardata = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "pardata");
+
+		n = get_particle_positions_sizes_vel(rmd, psys, ob, &pos, &size, &vel, pardata);
 		dm = CDDM_new(n, 0, 0, 0, 0);
 		mv = dm->getVertArray(dm);
 		psize = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, n, "psize");
@@ -256,6 +248,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 		velY = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, n, "velY");
 		velZ = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, n, "velZ");
 
+#pragma omp parallel for
 		for (i = 0; i < n; i++)
 		{
 			copy_v3_v3(mv[i].co, pos[i]);
@@ -265,20 +258,14 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 			velZ[i] = vel[i][2];
 		}
 
-		if (pos)
-			MEM_freeN(pos);
-
-		if (size)
-			MEM_freeN(size);
-
-		if (vel)
-			MEM_freeN(vel);
-
 		if (verts_only)
 		{
+			BLI_memarena_free(pardata);
 			return dm;
 		}
 		else {
+			BLI_memarena_free(pardata);
+//#pragma omp parallel num_threads(4)
 			result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
 			dm->release(dm);
 			return result;
@@ -287,16 +274,20 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 	else if ((rmd->input & MOD_REMESH_VERTICES) && ((rmd->input & MOD_REMESH_PARTICLES) == 0))
 	{
 		//verts only
-		return BKE_repolygonize_dm(derived, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
+		DerivedMesh *result = NULL;
+//#pragma omp parallel
+		result = BKE_repolygonize_dm(derived, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
+		return result;
 	}
 	else if ((rmd->input & MOD_REMESH_VERTICES) && (rmd->input & MOD_REMESH_PARTICLES))
 	{
 		//both, for simplicity only use vert data here
 		float* ovX, *ovY, *ovZ;
 		n = 0;
+		MemArena *pardata = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, "pardata");
 
 		if (psys)
-			n = get_particle_positions_sizes_vel(rmd, psys, ob, &pos, &size, &vel);
+			n = get_particle_positions_sizes_vel(rmd, psys, ob, &pos, &size, &vel, pardata);
 
 		dm = CDDM_new(n + derived->numVertData, 0, 0, 0, 0);
 		psize = CustomData_add_layer_named(&dm->vertData, CD_PROP_FLT, CD_CALLOC, NULL, n + derived->numVertData, "psize");
@@ -311,6 +302,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 		ovY = CustomData_get_layer_named(&derived->vertData, CD_PROP_FLT, "velY");
 		ovZ = CustomData_get_layer_named(&derived->vertData, CD_PROP_FLT, "velZ");
 
+#pragma omp parallel for
 		for (i = 0; i < n; i++)
 		{
 			copy_v3_v3(mv[i].co, pos[i]);
@@ -320,6 +312,7 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 			velZ[i] = vel[i][2];
 		}
 
+#pragma omp parallel for
 		for (i = n; i < n + derived->numVertData; i++)
 		{
 			copy_v3_v3(mv[i].co, mv2[i-n].co);
@@ -329,20 +322,14 @@ static DerivedMesh *repolygonize(RemeshModifierData *rmd, Object* ob, DerivedMes
 			velZ[i] = ovZ ? ovZ[i-n] : 0.0f;
 		}
 
-		if (pos)
-			MEM_freeN(pos);
-
-		if (size)
-			MEM_freeN(size);
-
-		if (vel)
-			MEM_freeN(vel);
-
 		if (verts_only)
 		{
+			BLI_memarena_free(pardata);
 			return dm;
 		}
 		else {
+			BLI_memarena_free(pardata);
+//#pragma omp parallel
 			result = BKE_repolygonize_dm(dm, rmd->thresh, rmd->basesize, rmd->wiresize, rmd->rendersize, render, override_size);
 			dm->release(dm);
 			return result;



More information about the Bf-blender-cvs mailing list