11 changed files with 159 additions and 3 deletions
-
27src/citra_qt/main.cpp
-
3src/citra_qt/main.h
-
2src/core/CMakeLists.txt
-
9src/core/core.cpp
-
7src/core/core.h
-
3src/core/hle/service/gsp_gpu.cpp
-
4src/core/hw/gpu.cpp
-
2src/core/hw/gpu.h
-
53src/core/perf_stats.cpp
-
43src/core/perf_stats.h
-
9src/video_core/renderer_opengl/renderer_opengl.cpp
@ -0,0 +1,53 @@ |
|||
// Copyright 2017 Citra Emulator Project
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#include <chrono>
|
|||
#include "core/hw/gpu.h"
|
|||
#include "core/perf_stats.h"
|
|||
|
|||
namespace Core { |
|||
|
|||
void PerfStats::BeginSystemFrame() { |
|||
frame_begin = Clock::now(); |
|||
} |
|||
|
|||
void PerfStats::EndSystemFrame() { |
|||
auto frame_end = Clock::now(); |
|||
accumulated_frametime += frame_end - frame_begin; |
|||
system_frames += 1; |
|||
} |
|||
|
|||
void PerfStats::EndGameFrame() { |
|||
game_frames += 1; |
|||
} |
|||
|
|||
PerfStats::Results PerfStats::GetAndResetStats(u64 current_system_time_us) { |
|||
using DoubleSecs = std::chrono::duration<double, std::chrono::seconds::period>; |
|||
using std::chrono::duration_cast; |
|||
|
|||
auto now = Clock::now(); |
|||
// Walltime elapsed since stats were reset
|
|||
auto interval = duration_cast<DoubleSecs>(now - reset_point).count(); |
|||
|
|||
auto system_us_per_second = |
|||
static_cast<double>(current_system_time_us - reset_point_system_us) / interval; |
|||
|
|||
Results results{}; |
|||
results.system_fps = static_cast<double>(system_frames) / interval; |
|||
results.game_fps = static_cast<double>(game_frames) / interval; |
|||
results.frametime = duration_cast<DoubleSecs>(accumulated_frametime).count() / |
|||
static_cast<double>(system_frames); |
|||
results.emulation_speed = system_us_per_second / 1'000'000.0; |
|||
|
|||
// Reset counters
|
|||
reset_point = now; |
|||
reset_point_system_us = current_system_time_us; |
|||
accumulated_frametime = Clock::duration::zero(); |
|||
system_frames = 0; |
|||
game_frames = 0; |
|||
|
|||
return results; |
|||
} |
|||
|
|||
} // namespace Core
|
|||
@ -0,0 +1,43 @@ |
|||
// Copyright 2017 Citra Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <chrono> |
|||
#include "common/common_types.h" |
|||
|
|||
namespace Core { |
|||
|
|||
class PerfStats { |
|||
public: |
|||
using Clock = std::chrono::high_resolution_clock; |
|||
|
|||
struct Results { |
|||
/// System FPS (LCD VBlanks) in Hz |
|||
double system_fps; |
|||
/// Game FPS (GSP frame submissions) in Hz |
|||
double game_fps; |
|||
/// Walltime per system frame, in seconds, excluding any waits |
|||
double frametime; |
|||
/// Ratio of walltime / emulated time elapsed |
|||
double emulation_speed; |
|||
}; |
|||
|
|||
void BeginSystemFrame(); |
|||
void EndSystemFrame(); |
|||
void EndGameFrame(); |
|||
|
|||
Results GetAndResetStats(u64 current_system_time_us); |
|||
|
|||
private: |
|||
Clock::time_point reset_point = Clock::now(); |
|||
|
|||
Clock::time_point frame_begin; |
|||
Clock::duration accumulated_frametime = Clock::duration::zero(); |
|||
u64 reset_point_system_us = 0; |
|||
u32 system_frames = 0; |
|||
u32 game_frames = 0; |
|||
}; |
|||
|
|||
} // namespace Core |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue