88#include < Core/StringBox.h>
99#include < Core/StlUtils.h>
1010#include < Core/Math.h>
11+ #include < Core/Benchmark.h>
1112#include < array>
1213#include < map>
1314#include < memory>
@@ -46,6 +47,8 @@ namespace t8
4647 std::vector<std::pair<Color, Color>> replace_src_dst_bg_colors;
4748 };
4849
50+ enum class DrawPolicy { FULL, SUGGEST_PARTIAL, FORCE_PARTIAL, THRESHOLD_SELECT, MEASURE_SELECT };
51+
4952 // //////////////////////////////////////////////////
5053
5154 // Bad design.
@@ -63,6 +66,17 @@ namespace t8
6366 std::array<bool , NC*NR> dirty_flag_buffer;
6467 Color prev_clear_bg_color = Color::Default;
6568
69+ float dirty_fraction_threshold = 0 .5f ;
70+
71+ benchmark::TicTocTimer t8_ScreenHandler_redraw_timer;
72+ double measured_delay_ms_full = 0 ;
73+ double measured_delay_ms_partial = 0 ;
74+ int num_frames_between_measurings = 1000 ;
75+ int frame = 0 ;
76+ int measure_mode = 0 ; // 0: full, 1: partial.
77+ int num_full_redraws = 0 ;
78+ int num_partial_redraws = 0 ;
79+
6680 inline int index (int r, int c) const noexcept { return NC*r + c; }
6781
6882 std::string color2str (Color col) const
@@ -290,20 +304,108 @@ namespace t8
290304 prev_clear_bg_color = clear_bg_color;
291305 }
292306
293- // #FIXME: Implement modes for different heuristics e.g.:
294- // FillMode { FULL, PARTIAL, THRESHOLD_SELECT, MEASURE_SELECT, THRESHOLD_AND_MEASURE_SELECT };
295- // void print_screen_buffer(Color bg_color, FillMode win_fill_mode, FillMode posix_fill_mode).
296- void print_screen_buffer (Color clear_bg_color)
307+ void set_dirty_fraction_threshold (float thres)
308+ {
309+ dirty_fraction_threshold = thres;
310+ }
311+
312+ void set_num_frames_between_measurings (int num_frames)
313+ {
314+ num_frames_between_measurings = num_frames;
315+ }
316+
317+ int get_num_full_redraws () const { return num_full_redraws; }
318+ int get_num_partial_redraws () const { return num_partial_redraws; }
319+
320+ void print_screen_buffer (Color clear_bg_color, DrawPolicy policy = DrawPolicy::MEASURE_SELECT)
297321 {
322+ auto f_full_redraw = [this ](Color clear_bg_color)
323+ {
324+ print_screen_buffer_full (clear_bg_color);
325+ num_full_redraws++;
326+ };
327+
328+ auto f_partial_redraw = [this ](Color clear_bg_color)
329+ {
330+ diff_buffers (clear_bg_color);
331+ print_screen_buffer_partial (clear_bg_color);
332+ update_prev_buffers (clear_bg_color);
333+ return_cursor ();
334+ std::cout.flush ();
335+ num_partial_redraws++;
336+ };
337+
298338#ifdef _WIN32
299- print_screen_buffer_full (clear_bg_color);
339+ switch (policy)
340+ {
341+ case DrawPolicy::FULL:
342+ case DrawPolicy::SUGGEST_PARTIAL:
343+ f_full_redraw (clear_bg_color);
344+ break ;
345+ case DrawPolicy::FORCE_PARTIAL:
346+ f_partial_redraw (clear_bg_color);
347+ break ;
348+ default :
349+ break ;
350+ }
300351#else
301- diff_buffers (clear_bg_color);
302- print_screen_buffer_partial (clear_bg_color);
303- update_prev_buffers (clear_bg_color);
304- return_cursor ();
305- std::cout.flush ();
352+ switch (policy)
353+ {
354+ case DrawPolicy::FULL:
355+ f_full_redraw (clear_bg_color);
356+ break ;
357+ case DrawPolicy::SUGGEST_PARTIAL:
358+ case DrawPolicy::FORCE_PARTIAL:
359+ f_partial_redraw (clear_bg_color);
360+ break ;
361+ default :
362+ break ;
363+ }
306364#endif
365+ switch (policy)
366+ {
367+ case DrawPolicy::THRESHOLD_SELECT:
368+ {
369+ auto dirty_fraction = stlutils::count (dirty_flag_buffer, true ) / (NR*NC);
370+ if (dirty_fraction > dirty_fraction_threshold)
371+ f_full_redraw (clear_bg_color);
372+ else
373+ f_partial_redraw (clear_bg_color);
374+ break ;
375+ }
376+ case DrawPolicy::MEASURE_SELECT:
377+ {
378+ bool measured = false ;
379+ if (frame % num_frames_between_measurings == 0 )
380+ {
381+ if (measure_mode == 0 )
382+ {
383+ benchmark::tic (t8_ScreenHandler_redraw_timer);
384+ f_full_redraw (clear_bg_color);
385+ measured_delay_ms_full = benchmark::toc (t8_ScreenHandler_redraw_timer);
386+ }
387+ else if (measure_mode == 1 )
388+ {
389+ benchmark::tic (t8_ScreenHandler_redraw_timer);
390+ f_partial_redraw (clear_bg_color);
391+ measured_delay_ms_partial = benchmark::toc (t8_ScreenHandler_redraw_timer);
392+ }
393+ measure_mode = 1 - measure_mode;
394+ measured = true ;
395+ }
396+ if (!measured)
397+ {
398+ if (measured_delay_ms_partial <= measured_delay_ms_full)
399+ f_partial_redraw (clear_bg_color);
400+ else
401+ f_full_redraw (clear_bg_color);
402+ }
403+ break ;
404+ }
405+ default :
406+ break ;
407+ }
408+ frame++;
307409 }
308410
309411 void print_screen_buffer_full (Color clear_bg_color) const
0 commit comments