[Bf-blender-cvs] [bbb2e0614fc] master: Performance: Draw play head as an overlay

Jeroen Bakker noreply at git.blender.org
Tue Jun 23 12:03:36 CEST 2020


Commit: bbb2e0614fc3c017f4dbcdb8a26be612e8cb282e
Author: Jeroen Bakker
Date:   Tue Jun 23 07:59:34 2020 +0200
Branches: master
https://developer.blender.org/rBbbb2e0614fc3c017f4dbcdb8a26be612e8cb282e

Performance: Draw play head as an overlay

When playing back animations a playhead is updated in all the animation editors.
The drawing of the playhead is part of the drawing of the main region
`RGN_TYPE_WINDOW` that redraws the whole region.

This change will draw the play head and window scrollers when updating the
screen. This affects the Action editor, Timeline, Graph editor, NLA editor and
Sequence editor. There is noticeable speedup when using complex animation files.

Spring 02_020_A.anim.blend fps went from 11.8 to 12.5 when showing a timeline
and a action editor on a Ryzen 1700.

* When playing back animation the markers don't jump up/down when near the
  frame. This could be added back.

Reviewed By: Brecht van Lommel

Differential Revision: https://developer.blender.org/D8066

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

M	source/blender/blenkernel/BKE_screen.h
M	source/blender/editors/animation/time_scrub_ui.c
M	source/blender/editors/include/ED_anim_api.h
M	source/blender/editors/include/ED_time_scrub_ui.h
M	source/blender/editors/screen/screen_ops.c
M	source/blender/editors/space_action/space_action.c
M	source/blender/editors/space_graph/space_graph.c
M	source/blender/editors/space_nla/space_nla.c
M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_intern.h
M	source/blender/editors/space_sequencer/space_sequencer.c
M	source/blender/windowmanager/intern/wm_draw.c

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

diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index fc7146b8cf4..6b3217a2bea 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -142,6 +142,8 @@ typedef struct ARegionType {
   void (*exit)(struct wmWindowManager *wm, struct ARegion *region);
   /* draw entirely, view changes should be handled here */
   void (*draw)(const struct bContext *C, struct ARegion *region);
+  /* Handler to draw overlays. This handler is called every draw loop. */
+  void (*draw_overlay)(const struct bContext *C, struct ARegion *region);
   /* optional, compute button layout before drawing for dynamic size */
   void (*layout)(const struct bContext *C, struct ARegion *region);
   /* snap the size of the region (can be NULL for no snapping). */
diff --git a/source/blender/editors/animation/time_scrub_ui.c b/source/blender/editors/animation/time_scrub_ui.c
index 863f433c778..f4ed2add624 100644
--- a/source/blender/editors/animation/time_scrub_ui.c
+++ b/source/blender/editors/animation/time_scrub_ui.c
@@ -92,7 +92,9 @@ static void draw_current_frame(const Scene *scene,
                                bool display_seconds,
                                const View2D *v2d,
                                const rcti *scrub_region_rect,
-                               int current_frame)
+                               int current_frame,
+                               float sub_frame,
+                               bool draw_line)
 {
   const uiFontStyle *fstyle = UI_FSTYLE_WIDGET;
   int frame_x = UI_view2d_view_to_region_x(v2d, current_frame);
@@ -106,6 +108,23 @@ static void draw_current_frame(const Scene *scene,
   float bg_color[4];
   UI_GetThemeColorShade4fv(TH_CFRAME, -5, bg_color);
 
+  if (draw_line) {
+    /* Draw vertical line to from the bottom of the current frame box to the bottom of the screen.
+     */
+    const float subframe_x = UI_view2d_view_to_region_x(v2d, current_frame + sub_frame);
+    GPU_line_width(2.0f);
+    GPUVertFormat *format = immVertexFormat();
+    uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT);
+    immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
+    immUniformThemeColor(TH_CFRAME);
+    immBegin(GPU_PRIM_LINES, 2);
+
+    immVertex2f(pos, subframe_x, scrub_region_rect->ymax - box_padding);
+    immVertex2f(pos, subframe_x, 0.0f);
+    immEnd();
+    immUnbindProgram();
+  }
+
   UI_draw_roundbox_corner_set(UI_CNR_ALL);
 
   UI_draw_roundbox_3fv_alpha(true,
@@ -135,6 +154,28 @@ static void draw_current_frame(const Scene *scene,
                            text_color);
 }
 
+void ED_time_scrub_draw_current_frame(const ARegion *region,
+                                      const Scene *scene,
+                                      bool display_seconds,
+                                      bool draw_line)
+{
+  const View2D *v2d = &region->v2d;
+  GPU_matrix_push_projection();
+  wmOrtho2_region_pixelspace(region);
+
+  rcti scrub_region_rect;
+  get_time_scrub_region_rect(region, &scrub_region_rect);
+
+  draw_current_frame(scene,
+                     display_seconds,
+                     v2d,
+                     &scrub_region_rect,
+                     scene->r.cfra,
+                     scene->r.subframe,
+                     draw_line);
+  GPU_matrix_pop_projection();
+}
+
 void ED_time_scrub_draw(const ARegion *region,
                         const Scene *scene,
                         bool display_seconds,
@@ -161,8 +202,6 @@ void ED_time_scrub_draw(const ARegion *region,
         region, v2d, &numbers_rect, scene, display_seconds, TH_TEXT);
   }
 
-  draw_current_frame(scene, display_seconds, v2d, &scrub_region_rect, scene->r.cfra);
-
   GPU_matrix_pop_projection();
 }
 
diff --git a/source/blender/editors/include/ED_anim_api.h b/source/blender/editors/include/ED_anim_api.h
index 426a470b128..f46ef3ff1be 100644
--- a/source/blender/editors/include/ED_anim_api.h
+++ b/source/blender/editors/include/ED_anim_api.h
@@ -640,14 +640,14 @@ bool ANIM_remove_empty_action_from_animdata(struct AnimData *adt);
 /* ---------- Current Frame Drawing ---------------- */
 
 /* flags for Current Frame Drawing */
-enum eAnimEditDraw_CurrentFrame {
+typedef enum eAnimEditDraw_CurrentFrame {
   /* plain time indicator with no special indicators */
   /* DRAWCFRA_PLAIN = 0, */ /* UNUSED */
   /* time indication in seconds or frames */
   DRAWCFRA_UNIT_SECONDS = (1 << 0),
   /* draw indicator extra wide (for timeline) */
   DRAWCFRA_WIDE = (1 << 1),
-};
+} eAnimEditDraw_CurrentFrame;
 
 /* main call to draw current-frame indicator in an Animation Editor */
 void ANIM_draw_cfra(const struct bContext *C, struct View2D *v2d, short flag);
diff --git a/source/blender/editors/include/ED_time_scrub_ui.h b/source/blender/editors/include/ED_time_scrub_ui.h
index d5b9fa2a553..483dce56577 100644
--- a/source/blender/editors/include/ED_time_scrub_ui.h
+++ b/source/blender/editors/include/ED_time_scrub_ui.h
@@ -32,6 +32,11 @@ struct bContext;
 struct bDopeSheet;
 struct wmEvent;
 
+void ED_time_scrub_draw_current_frame(const struct ARegion *region,
+                                      const struct Scene *scene,
+                                      bool display_seconds,
+                                      bool draw_vert_line);
+
 void ED_time_scrub_draw(const struct ARegion *region,
                         const struct Scene *scene,
                         bool display_seconds,
diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c
index 37a8880e7a1..4b4287722ba 100644
--- a/source/blender/editors/screen/screen_ops.c
+++ b/source/blender/editors/screen/screen_ops.c
@@ -4273,6 +4273,13 @@ static void SCREEN_OT_region_context_menu(wmOperatorType *ot)
  *
  * Animation Step.
  * \{ */
+static bool screen_animation_region_supports_time_follow(eSpace_Type spacetype,
+                                                         eRegionType regiontype)
+{
+  return (regiontype == RGN_TYPE_WINDOW &&
+          ELEM(spacetype, SPACE_SEQ, SPACE_GRAPH, SPACE_ACTION, SPACE_NLA)) ||
+         (spacetype == SPACE_CLIP && regiontype == RGN_TYPE_PREVIEW);
+}
 
 static bool match_region_with_redraws(eSpace_Type spacetype,
                                       eRegionType regiontype,
@@ -4364,6 +4371,37 @@ static bool match_region_with_redraws(eSpace_Type spacetype,
   return false;
 }
 
+static void screen_animation_region_tag_redraw(ScrArea *area,
+                                               ARegion *region,
+                                               const Scene *scene,
+                                               eScreen_Redraws_Flag redraws)
+{
+  /* Do follow time here if editor type supports it */
+  if ((redraws & TIME_FOLLOW) &&
+      (screen_animation_region_supports_time_follow(area->spacetype, region->regiontype))) {
+    float w = BLI_rctf_size_x(&region->v2d.cur);
+    if (scene->r.cfra < region->v2d.cur.xmin) {
+      region->v2d.cur.xmax = scene->r.cfra;
+      region->v2d.cur.xmin = region->v2d.cur.xmax - w;
+      ED_region_tag_redraw(region);
+      return;
+    }
+    else if (scene->r.cfra > region->v2d.cur.xmax) {
+      region->v2d.cur.xmin = scene->r.cfra;
+      region->v2d.cur.xmax = region->v2d.cur.xmin + w;
+      ED_region_tag_redraw (region);
+      return;
+    }
+  }
+
+  if ((region->regiontype == RGN_TYPE_WINDOW) &&
+      (ELEM(area->spacetype, SPACE_GRAPH, SPACE_NLA, SPACE_ACTION, SPACE_SEQ))) {
+    /* No need to do a full redraw as the playhead is only updated. */
+    return;
+  }
+  ED_region_tag_redraw(region);
+}
+
 //#define PROFILE_AUDIO_SYNCH
 
 static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), const wmEvent *event)
@@ -4402,7 +4440,8 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), const wmEv
     }
 
     if (scene_eval == NULL) {
-      /* Happens when undo/redo system is used during playback, nothing meaningful we can do here.
+      /* Happens when undo/redo system is used during playback, nothing meaningful we can do
+       * here.
        */
     }
     else if (scene_eval->id.recalc & ID_RECALC_AUDIO_SEEK) {
@@ -4547,23 +4586,7 @@ static int screen_animation_step(bContext *C, wmOperator *UNUSED(op), const wmEv
           }
 
           if (redraw) {
-            ED_region_tag_redraw(region);
-            /* do follow here if editor type supports it */
-            if ((sad->redraws & TIME_FOLLOW)) {
-              if ((region->regiontype == RGN_TYPE_WINDOW &&
-                   ELEM(area->spacetype, SPACE_SEQ, SPACE_GRAPH, SPACE_ACTION, SPACE_NLA)) ||
-                  (area->spacetype == SPACE_CLIP && region->regiontype == RGN_TYPE_PREVIEW)) {
-                float w = BLI_rctf_size_x(&region->v2d.cur);
-                if (scene->r.cfra < region->v2d.cur.xmin) {
-                  region->v2d.cur.xmax = scene->r.cfra;
-                  region->v2d.cur.xmin = region->v2d.cur.xmax - w;
-                }
-                else if (scene->r.cfra > region->v2d.cur.xmax) {
-                  region->v2d.cur.xmin = scene->r.cfra;
-                  region->v2d.cur.xmax = region->v2d.cur.xmin + w;
-                }
-              }
-            }
+            screen_animation_region_tag_redraw(area, region, scene, sad->redraws);
           }
         }
       }
diff --git a/source/blender/editors/space_action/space_action.c b/source/blender/editors/space_action/space_action.c
index a8b3ec9cdf6..079cee290ae 100644
--- a/source/blender/editors/space_action/space_action.c
+++ b/source/blender/editors/space_action/space_action.c
@@ -184,6 +184,11 @@ static void action_main_region_draw(const bContext *C, ARegion *region)
   short marker_flag = 0;
   short cfra_flag = 0;
 
+  UI_view2d_view_ortho(v2d);
+  if (saction->flag & SACTION_DRAWTIME) {
+    cfra_flag |= DRAWCFRA_UNIT_SECONDS;
+  }
+
   /* clear and setup matrix */
   UI_ThemeClearColor(TH_BACK);
   GPU_clear(GPU_COLOR_BIT);
@@ -203,12 +208,6 @@ static void action_main_region_draw(const bContext *C, ARegion *region)
     draw_channel_strips(&ac, saction, region);
   }
 
-  /* current frame */
-  if (saction->flag & SACTION_DRAW

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list