From 2c9922804157b642767b0ccbad430149229e3d50 Mon Sep 17 00:00:00 2001 From: Joel Linn Date: Sun, 1 Dec 2019 21:37:52 +0100 Subject: [PATCH] [UI] Use ticks as frame time instead of file time. File time is not as accurate as its resolution suggests. This results in a zero time delta between frames for high fps. --- src/xenia/ui/window.cc | 20 ++++++++++++-------- src/xenia/ui/window.h | 4 ++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/xenia/ui/window.cc b/src/xenia/ui/window.cc index 0f955924a..306faec9a 100644 --- a/src/xenia/ui/window.cc +++ b/src/xenia/ui/window.cc @@ -173,12 +173,15 @@ void Window::OnPaint(UIEvent* e) { ++frame_count_; ++fps_frame_count_; - uint64_t now_ns = xe::Clock::QueryHostSystemTime(); - if (now_ns > fps_update_time_ns_ + 1000 * 10000) { + static auto tick_frequency = Clock::QueryHostTickFrequency(); + auto now_ticks = Clock::QueryHostTickCount(); + // Average fps over 1 second. + if (now_ticks > fps_update_time_ticks_ + tick_frequency * 1) { fps_ = static_cast( fps_frame_count_ / - (static_cast(now_ns - fps_update_time_ns_) / 10000000.0)); - fps_update_time_ns_ = now_ns; + (static_cast(now_ticks - fps_update_time_ticks_) / + tick_frequency)); + fps_update_time_ticks_ = now_ticks; fps_frame_count_ = 0; } @@ -186,12 +189,13 @@ void Window::OnPaint(UIEvent* e) { // Prepare ImGui for use this frame. auto& io = imgui_drawer_->GetIO(); - if (!last_paint_time_ns_) { + if (!last_paint_time_ticks_) { io.DeltaTime = 0.0f; - last_paint_time_ns_ = now_ns; + last_paint_time_ticks_ = now_ticks; } else { - io.DeltaTime = (now_ns - last_paint_time_ns_) / 10000000.0f; - last_paint_time_ns_ = now_ns; + io.DeltaTime = (now_ticks - last_paint_time_ticks_) / + static_cast(tick_frequency); + last_paint_time_ticks_ = now_ticks; } io.DisplaySize = ImVec2(static_cast(scaled_width()), static_cast(scaled_height())); diff --git a/src/xenia/ui/window.h b/src/xenia/ui/window.h index 6cbc7a250..2cb5c8c34 100644 --- a/src/xenia/ui/window.h +++ b/src/xenia/ui/window.h @@ -180,9 +180,9 @@ class Window { uint32_t frame_count_ = 0; uint32_t fps_ = 0; - uint64_t fps_update_time_ns_ = 0; + uint64_t fps_update_time_ticks_ = 0; uint64_t fps_frame_count_ = 0; - uint64_t last_paint_time_ns_ = 0; + uint64_t last_paint_time_ticks_ = 0; bool modifier_shift_pressed_ = false; bool modifier_cntrl_pressed_ = false;