From 20221217d43ad3958ccff1c4e5b3db4b85b5b983 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lars=20Kr=C3=A4mer?= <24323470+larskraemer@users.noreply.github.com> Date: Wed, 24 Jun 2020 20:14:24 +0200 Subject: [PATCH] Frame-timing using chrono --- src/gl/inject_glx.cpp | 14 ++++++++------ src/overlay.cpp | 16 +++++++++------- src/overlay.h | 11 ++++++----- src/overlay_params.cpp | 3 ++- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/gl/inject_glx.cpp b/src/gl/inject_glx.cpp index 13da5dbc..624bc379 100644 --- a/src/gl/inject_glx.cpp +++ b/src/gl/inject_glx.cpp @@ -127,10 +127,11 @@ EXPORT_C_(void) glXSwapBuffers(void* dpy, void* drawable) { do_imgui_swap(dpy, drawable); glx.SwapBuffers(dpy, drawable); - if (!is_blacklisted() && fps_limit_stats.targetFrameTime > 0){ - fps_limit_stats.frameStart = os_time_get_nano(); + using namespace std::chrono_literals; + if (!is_blacklisted() && fps_limit_stats.targetFrameTime > 0s){ + fps_limit_stats.frameStart = Clock::now(); FpsLimiter(fps_limit_stats); - fps_limit_stats.frameEnd = os_time_get_nano(); + fps_limit_stats.frameEnd = Clock::now(); } } @@ -141,10 +142,11 @@ EXPORT_C_(int64_t) glXSwapBuffersMscOML(void* dpy, void* drawable, int64_t targe do_imgui_swap(dpy, drawable); int64_t ret = glx.SwapBuffersMscOML(dpy, drawable, target_msc, divisor, remainder); - if (!is_blacklisted() && fps_limit_stats.targetFrameTime > 0){ - fps_limit_stats.frameStart = os_time_get_nano(); + using namespace std::chrono_literals; + if (!is_blacklisted() && fps_limit_stats.targetFrameTime > 0s){ + fps_limit_stats.frameStart = Clock::now(); FpsLimiter(fps_limit_stats); - fps_limit_stats.frameEnd = os_time_get_nano(); + fps_limit_stats.frameEnd = Clock::now(); } return ret; } diff --git a/src/overlay.cpp b/src/overlay.cpp index 08883cb6..ed189b10 100644 --- a/src/overlay.cpp +++ b/src/overlay.cpp @@ -2381,11 +2381,11 @@ static void overlay_DestroySwapchainKHR( void FpsLimiter(struct fps_limit& stats){ stats.sleepTime = stats.targetFrameTime - (stats.frameStart - stats.frameEnd); if (stats.sleepTime > stats.frameOverhead) { - int64_t adjustedSleep = stats.sleepTime - stats.frameOverhead; - this_thread::sleep_for(chrono::nanoseconds(adjustedSleep)); - stats.frameOverhead = ((os_time_get_nano() - stats.frameStart) - adjustedSleep); + auto adjustedSleep = stats.sleepTime - stats.frameOverhead; + this_thread::sleep_for(adjustedSleep); + stats.frameOverhead = ((Clock::now() - stats.frameStart) - adjustedSleep); if (stats.frameOverhead > stats.targetFrameTime) - stats.frameOverhead = 0; + stats.frameOverhead = Clock::duration(0); } } @@ -2435,10 +2435,12 @@ static VkResult overlay_QueuePresentKHR( result = chain_result; } - if (fps_limit_stats.targetFrameTime > 0){ - fps_limit_stats.frameStart = os_time_get_nano(); + using namespace std::chrono_literals; + + if (fps_limit_stats.targetFrameTime > 0s){ + fps_limit_stats.frameStart = Clock::now(); FpsLimiter(fps_limit_stats); - fps_limit_stats.frameEnd = os_time_get_nano(); + fps_limit_stats.frameEnd = Clock::now(); } return result; diff --git a/src/overlay.h b/src/overlay.h index 45521948..cb66dcc8 100644 --- a/src/overlay.h +++ b/src/overlay.h @@ -4,6 +4,7 @@ #include "imgui.h" #include "overlay_params.h" #include "iostats.h" +#include "timing.hpp" struct frame_stat { uint64_t stats[OVERLAY_PLOTS_MAX]; @@ -44,11 +45,11 @@ struct swapchain_stats { }; struct fps_limit { - int64_t frameStart; - int64_t frameEnd; - int64_t targetFrameTime; - int64_t frameOverhead; - int64_t sleepTime; + Clock::time_point frameStart; + Clock::time_point frameEnd; + Clock::duration targetFrameTime; + Clock::duration frameOverhead; + Clock::duration sleepTime; }; struct benchmark_stats { diff --git a/src/overlay_params.cpp b/src/overlay_params.cpp index ae30711c..39556f16 100644 --- a/src/overlay_params.cpp +++ b/src/overlay_params.cpp @@ -485,8 +485,9 @@ parse_overlay_config(struct overlay_params *params, } // set frametime limit + using namespace std::chrono; if (params->fps_limit >= 0) - fps_limit_stats.targetFrameTime = int64_t(1000000000.0 / params->fps_limit); + fps_limit_stats.targetFrameTime = duration_cast(duration(1) / params->fps_limit); #ifdef HAVE_DBUS if (params->enabled[OVERLAY_PARAM_ENABLED_media_player]) {