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