[Bf-blender-cvs] [63ec900] master: [T40792] Optimisations for FCurve Drawing - Lower sampling precision when "High Quality" drawing disabled

Joshua Leung noreply at git.blender.org
Sun Nov 16 11:34:09 CET 2014


Commit: 63ec900af9a15443b74458462b55ce563bba721a
Author: Joshua Leung
Date:   Sun Nov 16 23:02:31 2014 +1300
Branches: master
https://developer.blender.org/rB63ec900af9a15443b74458462b55ce563bba721a

[T40792] Optimisations for FCurve Drawing - Lower sampling precision when "High Quality" drawing disabled

When the "High Quality Line Drawing" option (View menu) is disabled,
the sampling rate (i.e. the size of timesteps to use when sampling
the FCurve for drawing it in most cases now) is set to be quite low
(i.e. at 0.1 frame increments). This amounts to at most 10 sub-steps.

In one test file (with a wide window), this had the effect of improving
the performance by over 3x. It's still not as good as a sampling-free
approach, but for this functionality is still needed for FModifiers,
so it's better that we can optimise this.

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

M	source/blender/editors/space_graph/graph_draw.c

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

diff --git a/source/blender/editors/space_graph/graph_draw.c b/source/blender/editors/space_graph/graph_draw.c
index 466fe79..5eec5c2 100644
--- a/source/blender/editors/space_graph/graph_draw.c
+++ b/source/blender/editors/space_graph/graph_draw.c
@@ -475,6 +475,7 @@ static void draw_fcurve_samples(SpaceIpo *sipo, ARegion *ar, FCurve *fcu)
 /* helper func - just draw the F-Curve by sampling the visible region (for drawing curves with modifiers) */
 static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d, View2DGrid *grid)
 {
+	SpaceIpo *sipo = (SpaceIpo *)ac->sl;
 	ChannelDriver *driver;
 	float samplefreq;
 	float stime, etime;
@@ -512,7 +513,25 @@ static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d
 	/* grid->dx represents the number of 'frames' between gridlines, but we divide by U.v2d_min_gridsize to get pixels-steps */
 	/* TODO: perhaps we should have 1.0 frames as upper limit so that curves don't get too distorted? */
 	samplefreq = dx / (U.v2d_min_gridsize * U.pixelsize);
-	if (samplefreq < 0.00001f) samplefreq = 0.00001f;
+	
+	if (sipo->flag & SIPO_BEAUTYDRAW_OFF) {
+		/* Low Precision = coarse lower-bound clamping
+		 * 
+		 * Although the "Beauty Draw" flag was originally for AA'd
+		 * line drawing, the sampling rate here has a much greater
+		 * impact on performance (e.g. for T40372)!
+		 *
+		 * This one still amounts to 10 sample-frames for each 1-frame interval
+		 * which should be quite a decent approximation in many situations.
+		 */
+		if (samplefreq < 0.1f)
+			samplefreq = 0.1f;
+	}
+	else {
+		/* "Higher Precision" but slower - especially on larger windows (e.g. T40372) */
+		if (samplefreq < 0.00001f)
+			samplefreq = 0.00001f;
+	}
 	
 	
 	/* the start/end times are simply the horizontal extents of the 'cur' rect */
@@ -527,7 +546,7 @@ static void draw_fcurve_curve(bAnimContext *ac, ID *id, FCurve *fcu, View2D *v2d
 	glBegin(GL_LINE_STRIP);
 	
 	n = (etime - stime) / samplefreq + 0.5f;
-	for (i = 0; i < n; i++) {
+	for (i = 0; i <= n; i++) {
 		float ctime = stime + i * samplefreq;
 		glVertex2f(ctime, evaluate_fcurve(fcu, ctime) * unitFac);
 	}




More information about the Bf-blender-cvs mailing list