Add timer

This commit is contained in:
Nathan Chapman 2025-07-13 12:53:42 -06:00
parent cf6a5ba018
commit fd9162ef64
8 changed files with 77 additions and 5 deletions

View File

@ -20,4 +20,6 @@ struct Render_Data {
s32 width = 0;
s32 height = 0;
s32 triangle_count = 0;
f32 frame_time = 0.0f;
f32 user_interface_generate_time = 0.0f;
};

View File

@ -73,6 +73,9 @@ bool init_renderer(Renderer *renderer, u32 width, u32 height) {
init_user_interface(&renderer->user_interface, &renderer->render_data);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
return true;
}
@ -89,6 +92,10 @@ void set_renderer_size(Renderer *renderer, u32 width, u32 height) {
}
void draw_renderer(Renderer *renderer) {
// FPS time
static f32 previous_frame_start_time = 0.0;
f32 frame_start_time = glfwGetTime();
while(renderer->render_data.width == 0 || renderer->render_data.height == 0) {
glfwGetFramebufferSize(renderer->render_data.glfw_window, &renderer->render_data.width, &renderer->render_data.height);
glfwWaitEvents();
@ -100,9 +107,6 @@ void draw_renderer(Renderer *renderer) {
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
Vector3 camera_position = Vector3(0.4f, 0.3f, 1.0f);
Vector3 camera_look_at_position = Vector3(0.0f, 0.0f, 0.0f);
Vector3 camera_up_vector = Vector3(0.0f, 1.0f, 0.0f);
@ -134,8 +138,17 @@ void draw_renderer(Renderer *renderer) {
unbind_frame_buffer(&renderer->frame_buffer);
draw_frame_buffer(&renderer->frame_buffer);
// Timer
start_timer(&renderer->timer);
create_user_interface_frame(&renderer->user_interface, &renderer->render_data);
renderer->render_data.user_interface_generate_time = stop_timer(&renderer->timer);
render_user_interface(&renderer->user_interface);
// FPS time
renderer->render_data.frame_time = frame_start_time - previous_frame_start_time;
previous_frame_start_time = frame_start_time;
}
void upload_renderer_data(Renderer *renderer, Mesh *vertex_data) {

View File

@ -7,6 +7,7 @@
#include <glm/gtc/type_ptr.hpp>
#include "render_data.h"
#include "user_interface.h"
#include "timer.h"
struct Frame_Buffer {
@ -51,6 +52,7 @@ struct Renderer {
Matrix4 projection_matrix = Matrix4(1.0f);
User_Interface user_interface;
Render_Data render_data;
Timer timer;
};

22
src/timer.cpp Normal file
View File

@ -0,0 +1,22 @@
#include "timer.h"
void start_timer(Timer *timer) {
if (timer->running) {
return;
}
timer->running = true;
timer->start_time = std::chrono::steady_clock::now();
}
f32 stop_timer(Timer *timer) {
if (!timer->running) {
return 0;
}
timer->running = false;
auto stop_time = std::chrono::steady_clock::now();
f32 timer_milliseconds = std::chrono::duration_cast<std::chrono::microseconds>(stop_time - timer->start_time).count() / 1000.0f;
return timer_milliseconds;
}

12
src/timer.h Normal file
View File

@ -0,0 +1,12 @@
#pragma once
#include "basic.h"
#include <chrono>
struct Timer {
bool running = false;
std::chrono::time_point<std::chrono::steady_clock> start_time{};
};
void start_timer(Timer *timer);
f32 stop_timer(Timer *timer);

View File

@ -19,6 +19,24 @@ void create_user_interface_frame(User_Interface *user_interface, Render_Data *re
ImGuiWindowFlags imgui_window_flags = 0;
ImGui::SetNextWindowBgAlpha(0.8f);
ImGui::Begin("Control", nullptr, imgui_window_flags);
static f32 new_fps = 0.0f;
if (render_data->frame_time > 0.0) {
new_fps = 1.0f / render_data->frame_time;
}
user_interface->frames_per_second = (user_interface->averaging_alpha * user_interface->frames_per_second) + (1.0f - user_interface->averaging_alpha) * new_fps;
ImGui::Text("FPS:");
ImGui::SameLine();
ImGui::Text(std::to_string(user_interface->frames_per_second).c_str());
ImGui::Separator();
ImGui::Text("UI generation time:");
ImGui::SameLine();
ImGui::Text(std::to_string(render_data->user_interface_generate_time).c_str());
ImGui::SameLine();
ImGui::Text("ms");
ImGui::Separator();
ImGui::Text("Triangles:");
ImGui::SameLine();
ImGui::Text(std::to_string(render_data->triangle_count).c_str());

View File

@ -3,6 +3,8 @@
#include "render_data.h"
struct User_Interface {
f32 frames_per_second = 0.0f;
f32 averaging_alpha = 0.96f;
};
bool init_user_interface(User_Interface *user_interface, Render_Data *render_data);

View File

@ -45,8 +45,9 @@ bool init(Window *window, u32 width, u32 height, string title) {
glfwSetWindowSizeCallback(window->glfw_window, handle_window_resize_events);
glfwSetWindowCloseCallback(window->glfw_window, handle_close);
glfwSetKeyCallback(window->glfw_window, handle_key_events);
glfwSetCursorPosCallback(window->glfw_window, handle_mouse_position_events);
glfwSetMouseButtonCallback(window->glfw_window, handle_mouse_button_events);
// Have to disable so ImGui will accept mouse events
// glfwSetCursorPosCallback(window->glfw_window, handle_mouse_position_events);
// glfwSetMouseButtonCallback(window->glfw_window, handle_mouse_button_events);
window->model = new Model();
init_model(window->model);