safe_ptr<diagnostics::graph> graph_;\r
boost::timer perf_timer_;\r
boost::timer tick_timer_;\r
- boost::timer vblank_timer_;\r
\r
caspar::high_prec_timer wait_timer_;\r
\r
graph_->set_color("tick-time", diagnostics::color(0.0f, 0.6f, 0.9f)); \r
graph_->set_color("frame-time", diagnostics::color(0.1f, 1.0f, 0.1f));\r
graph_->set_color("dropped-frame", diagnostics::color(0.3f, 0.6f, 0.3f));\r
+\r
graph_->set_text(print());\r
diagnostics::register_graph(graph_);\r
\r
\r
void try_sleep_almost_until_vblank()\r
{\r
- static const double THRESHOLD = 0.005;\r
+ static const double THRESHOLD = 0.003;\r
double threshold = config_.vsync ? THRESHOLD : 0.0;\r
\r
- auto elapsed = vblank_timer_.elapsed();\r
auto frame_time = 1.0 / (format_desc_.fps * format_desc_.field_count);\r
\r
- if (elapsed + threshold < frame_time)\r
- {\r
- wait_timer_.tick(frame_time - elapsed - threshold);\r
- }\r
+ wait_timer_.tick(frame_time - threshold);\r
+ }\r
+\r
+ void wait_for_vblank_and_display()\r
+ {\r
+ try_sleep_almost_until_vblank();\r
+ window_.Display();\r
+ // Make sure that the next tick measures the duration from this point in time.\r
+ wait_timer_.tick(0.0);\r
}\r
\r
safe_ptr<AVFrame> get_av_frame()\r
render(frames[0], frame->image_data().size());\r
graph_->set_value("frame-time", perf_timer_.elapsed() * format_desc_.fps * 0.5);\r
\r
- try_sleep_almost_until_vblank();\r
- window_.Display();\r
- vblank_timer_.restart();\r
+ wait_for_vblank_and_display(); // progressive frame\r
}\r
else if (frames.size() == 2)\r
{\r
render(frames[0], frame->image_data().size());\r
double perf_elapsed = perf_timer_.elapsed();\r
\r
- try_sleep_almost_until_vblank();\r
- window_.Display();\r
- vblank_timer_.restart();\r
+ wait_for_vblank_and_display(); // field1\r
\r
perf_timer_.restart();\r
render(frames[1], frame->image_data().size());\r
perf_elapsed += perf_timer_.elapsed();\r
graph_->set_value("frame-time", perf_elapsed * format_desc_.fps * 0.5);\r
\r
- try_sleep_almost_until_vblank();\r
- window_.Display();\r
- vblank_timer_.restart();\r
+ wait_for_vblank_and_display(); // field2\r
}\r
}\r
\r