implemented fps counter
This commit is contained in:
parent
ce2c7a7d01
commit
f732704b83
|
@ -1,17 +1,29 @@
|
||||||
#include "emulator.h"
|
#include "emulator.h"
|
||||||
#include <fmt/core.h>
|
|
||||||
#include <Core/PS4/HLE/Graphics/graphics_render.h>
|
#include <Core/PS4/HLE/Graphics/graphics_render.h>
|
||||||
#include <Emulator/Host/controller.h>
|
#include <Emulator/Host/controller.h>
|
||||||
#include "Emulator/Util/singleton.h"
|
#include <Lib/Timer.h>
|
||||||
|
#include <fmt/core.h>
|
||||||
#include <vulkan_util.h>
|
#include <vulkan_util.h>
|
||||||
|
|
||||||
#include "Core/PS4/HLE/Graphics/video_out.h"
|
#include "Core/PS4/HLE/Graphics/video_out.h"
|
||||||
#include "Emulator/HLE/Libraries/LibPad/pad.h"
|
#include "Emulator/HLE/Libraries/LibPad/pad.h"
|
||||||
|
#include "Emulator/Util/singleton.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
namespace Emu {
|
namespace Emu {
|
||||||
|
|
||||||
bool m_emu_needs_exit = false;
|
bool m_emu_needs_exit = false;
|
||||||
|
double m_current_time_seconds = {0.0};
|
||||||
|
double m_previous_time_seconds = {0.0};
|
||||||
|
int m_update_num = {0};
|
||||||
|
int m_frame_num = {0};
|
||||||
|
double m_update_time_seconds = {0.0};
|
||||||
|
double m_current_fps = {0.0};
|
||||||
|
int m_max_updates_per_frame = {4};
|
||||||
|
double m_update_fixed_time = 1.0 / 60.0;
|
||||||
|
int m_fps_frames_num = {0};
|
||||||
|
double m_fps_start_time = {0};
|
||||||
|
|
||||||
void emuInit(u32 width, u32 height) {
|
void emuInit(u32 width, u32 height) {
|
||||||
auto* window_ctx = singleton<Emu::WindowCtx>::instance();
|
auto* window_ctx = singleton<Emu::WindowCtx>::instance();
|
||||||
|
@ -49,7 +61,39 @@ static void CreateSdlWindow(WindowCtx* ctx) {
|
||||||
|
|
||||||
SDL_SetWindowResizable(ctx->m_window, SDL_FALSE); // we don't support resizable atm
|
SDL_SetWindowResizable(ctx->m_window, SDL_FALSE); // we don't support resizable atm
|
||||||
}
|
}
|
||||||
|
static void update() {
|
||||||
|
static double lag = 0.0;
|
||||||
|
|
||||||
|
lag += m_current_time_seconds - m_previous_time_seconds;
|
||||||
|
|
||||||
|
int num = 0;
|
||||||
|
|
||||||
|
while (lag >= m_update_fixed_time) {
|
||||||
|
if (num < m_max_updates_per_frame) {
|
||||||
|
m_update_num++;
|
||||||
|
num++;
|
||||||
|
m_update_time_seconds = m_update_num * m_update_fixed_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
lag -= m_update_fixed_time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static void calculateFps(double game_time_s) {
|
||||||
|
m_previous_time_seconds = m_current_time_seconds;
|
||||||
|
m_current_time_seconds = game_time_s;
|
||||||
|
|
||||||
|
m_frame_num++;
|
||||||
|
|
||||||
|
m_fps_frames_num++;
|
||||||
|
if (m_current_time_seconds - m_fps_start_time > 0.25f) {
|
||||||
|
m_current_fps = static_cast<double>(m_fps_frames_num) / (m_current_time_seconds - m_fps_start_time);
|
||||||
|
m_fps_frames_num = 0;
|
||||||
|
m_fps_start_time = m_current_time_seconds;
|
||||||
|
}
|
||||||
|
}
|
||||||
void emuRun() {
|
void emuRun() {
|
||||||
|
Lib::Timer timer;
|
||||||
|
timer.Start();
|
||||||
auto* window_ctx = singleton<Emu::WindowCtx>::instance();
|
auto* window_ctx = singleton<Emu::WindowCtx>::instance();
|
||||||
{
|
{
|
||||||
// init window and wait until init finishes
|
// init window and wait until init finishes
|
||||||
|
@ -58,6 +102,7 @@ void emuRun() {
|
||||||
Graphics::Vulkan::vulkanCreate(window_ctx);
|
Graphics::Vulkan::vulkanCreate(window_ctx);
|
||||||
window_ctx->m_is_graphic_initialized = true;
|
window_ctx->m_is_graphic_initialized = true;
|
||||||
window_ctx->m_graphic_initialized_cond.notify_one();
|
window_ctx->m_graphic_initialized_cond.notify_one();
|
||||||
|
calculateFps(timer.GetTimeSec());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool exit_loop = false;
|
bool exit_loop = false;
|
||||||
|
@ -88,9 +133,13 @@ void emuRun() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
exit_loop = m_emu_needs_exit;
|
exit_loop = m_emu_needs_exit;
|
||||||
|
|
||||||
if (!exit_loop) {
|
if (!exit_loop) {
|
||||||
HLE::Libs::Graphics::VideoOut::videoOutFlip(100000); // flip every 0.1 sec
|
update();
|
||||||
|
}
|
||||||
|
if (!exit_loop) {
|
||||||
|
if (HLE::Libs::Graphics::VideoOut::videoOutFlip(100000)) { // flip every 0.1 sec
|
||||||
|
calculateFps(timer.GetTimeSec());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::exit(0);
|
std::exit(0);
|
||||||
|
@ -102,6 +151,12 @@ HLE::Libs::Graphics::GraphicCtx* getGraphicCtx() {
|
||||||
return &window_ctx->m_graphic_ctx;
|
return &window_ctx->m_graphic_ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateSDLTitle() {
|
||||||
|
char title[256];
|
||||||
|
sprintf(title, "shadps4 v %s FPS: %f", Emulator::VERSION, m_current_fps);
|
||||||
|
auto* window_ctx = singleton<Emu::WindowCtx>::instance();
|
||||||
|
SDL_SetWindowTitle(window_ctx->m_window, title);
|
||||||
|
}
|
||||||
void DrawBuffer(HLE::Libs::Graphics::VideoOutVulkanImage* image) {
|
void DrawBuffer(HLE::Libs::Graphics::VideoOutVulkanImage* image) {
|
||||||
auto* window_ctx = singleton<Emu::WindowCtx>::instance();
|
auto* window_ctx = singleton<Emu::WindowCtx>::instance();
|
||||||
if (window_ctx->is_window_hidden) {
|
if (window_ctx->is_window_hidden) {
|
||||||
|
@ -192,6 +247,7 @@ void DrawBuffer(HLE::Libs::Graphics::VideoOutVulkanImage* image) {
|
||||||
fmt::print("vkQueuePresentKHR failed\n");
|
fmt::print("vkQueuePresentKHR failed\n");
|
||||||
std::exit(0);
|
std::exit(0);
|
||||||
}
|
}
|
||||||
|
updateSDLTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
void keyboardEvent(SDL_Event* event) {
|
void keyboardEvent(SDL_Event* event) {
|
||||||
|
|
Loading…
Reference in New Issue