Skip to content

Commit d00d94d

Browse files
committed
ScreenHandler.h: Added drawing policies.
* New enum class DrawPolicy. * Support to change it using GameEngineParams::draw_policy.
1 parent 9554e00 commit d00d94d

File tree

2 files changed

+118
-11
lines changed

2 files changed

+118
-11
lines changed

screen/ScreenHandler.h

Lines changed: 112 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
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

sys/GameEngine.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ namespace t8x
7979
bool suppress_tty_input = false;
8080

8181
bool enable_benchmark = false;
82+
t8::DrawPolicy draw_policy = t8::DrawPolicy::MEASURE_SELECT;
8283
};
8384

8485
template<int NR = 30, int NC = 80>
@@ -311,6 +312,8 @@ namespace t8x
311312

312313
curr_rnd_seed = rnd::srand_time();
313314

315+
std::cout << folder::get_pwd() << std::endl;
316+
std::cout << get_exe_folder() << std::endl;
314317
t8x::setup_logging(m_params.log_mode, get_exe_folder(), m_params.xcode_log_path, m_params.log_filename, curr_rnd_seed);
315318

316319
if (m_params.enable_benchmark)
@@ -372,6 +375,8 @@ namespace t8x
372375
auto avg_fps = frame_ctr / dur_s;
373376
std::cout << "Goal FPS = " << real_fps << std::endl;
374377
std::cout << "Average FPS = " << avg_fps << std::endl;
378+
std::cout << "# Full Redraws = " << sh.get_num_full_redraws() << std::endl;
379+
std::cout << "# Partial Redraws = " << sh.get_num_partial_redraws() << std::endl;
375380
}
376381

377382
if (m_params.enable_terminal_window_resize)
@@ -581,7 +586,7 @@ namespace t8x
581586

582587
if (!m_params.suppress_tty_output)
583588
{
584-
sh.print_screen_buffer(bg_color);
589+
sh.print_screen_buffer(bg_color, m_params.draw_policy);
585590
//sh.print_screen_buffer_chars();
586591
//sh.print_screen_buffer_fg_colors();
587592
//sh.print_screen_buffer_bg_colors();

0 commit comments

Comments
 (0)