Merge pull request #9417 from Filoppi/input-1

Fix FPS counter and Game Window speed % breaking on pause/unpause
This commit is contained in:
Léo Lam
2021-05-07 15:08:01 +02:00
committed by GitHub
7 changed files with 125 additions and 31 deletions

View File

@ -8,6 +8,7 @@
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/Timer.h"
#include "Core/Core.h"
#include "VideoCommon/FPSCounter.h"
#include "VideoCommon/VideoConfig.h"
@ -16,6 +17,18 @@ static constexpr u64 FPS_REFRESH_INTERVAL = 250000;
FPSCounter::FPSCounter()
{
m_last_time = Common::Timer::GetTimeUs();
m_on_state_changed_handle = Core::AddOnStateChangedCallback([this](Core::State state) {
if (state == Core::State::Paused)
SetPaused(true);
else if (state == Core::State::Running)
SetPaused(false);
});
}
FPSCounter::~FPSCounter()
{
Core::RemoveOnStateChangedCallback(&m_on_state_changed_handle);
}
void FPSCounter::LogRenderTimeToFile(u64 val)
@ -31,8 +44,9 @@ void FPSCounter::LogRenderTimeToFile(u64 val)
void FPSCounter::Update()
{
u64 time = Common::Timer::GetTimeUs();
u64 diff = time - m_last_time;
const u64 time = Common::Timer::GetTimeUs();
const u64 diff = time - m_last_time;
m_time_diff_secs = static_cast<double>(diff / 1000000.0);
if (g_ActiveConfig.bLogRenderTimeToFile)
LogRenderTimeToFile(diff);
@ -47,3 +61,17 @@ void FPSCounter::Update()
m_time_since_update = 0;
}
}
void FPSCounter::SetPaused(bool paused)
{
if (paused)
{
m_last_time_pause = Common::Timer::GetTimeUs();
}
else
{
const u64 time = Common::Timer::GetTimeUs();
const u64 diff = time - m_last_time_pause;
m_last_time += diff;
}
}

View File

@ -11,20 +11,30 @@
class FPSCounter
{
public:
// Initializes the FPS counter.
FPSCounter();
~FPSCounter();
FPSCounter(const FPSCounter&) = delete;
FPSCounter& operator=(const FPSCounter&) = delete;
FPSCounter(FPSCounter&&) = delete;
FPSCounter& operator=(FPSCounter&&) = delete;
// Called when a frame is rendered (updated every second).
void Update();
float GetFPS() const { return m_fps; }
double GetDeltaTime() const { return m_time_diff_secs; }
private:
void SetPaused(bool paused);
u64 m_last_time = 0;
u64 m_time_since_update = 0;
u64 m_last_time_pause = 0;
u32 m_frame_counter = 0;
float m_fps = 0;
int m_on_state_changed_handle = -1;
float m_fps = 0.f;
std::ofstream m_bench_file;
double m_time_diff_secs = 0.0;
void LogRenderTimeToFile(u64 val);
};

View File

@ -1335,7 +1335,12 @@ void Renderer::Swap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height, u6
{
// Remove stale EFB/XFB copies.
g_texture_cache->Cleanup(m_frame_count);
Core::Callback_FramePresented();
const double last_speed_denominator =
m_fps_counter.GetDeltaTime() * VideoInterface::GetTargetRefreshRate();
// The denominator should always be > 0 but if it's not, just return 1
const double last_speed =
last_speed_denominator > 0.0 ? (1.0 / last_speed_denominator) : 1.0;
Core::Callback_FramePresented(last_speed);
}
// Handle any config changes, this gets propagated to the backend.