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 width = 0;
s32 height = 0; s32 height = 0;
s32 triangle_count = 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); init_user_interface(&renderer->user_interface, &renderer->render_data);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
return true; return true;
} }
@ -89,6 +92,10 @@ void set_renderer_size(Renderer *renderer, u32 width, u32 height) {
} }
void draw_renderer(Renderer *renderer) { 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) { 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); glfwGetFramebufferSize(renderer->render_data.glfw_window, &renderer->render_data.width, &renderer->render_data.height);
glfwWaitEvents(); glfwWaitEvents();
@ -100,9 +107,6 @@ void draw_renderer(Renderer *renderer) {
glClearDepth(1.0f); glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 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_position = Vector3(0.4f, 0.3f, 1.0f);
Vector3 camera_look_at_position = Vector3(0.0f, 0.0f, 0.0f); Vector3 camera_look_at_position = Vector3(0.0f, 0.0f, 0.0f);
Vector3 camera_up_vector = Vector3(0.0f, 1.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); unbind_frame_buffer(&renderer->frame_buffer);
draw_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); 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); 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) { void upload_renderer_data(Renderer *renderer, Mesh *vertex_data) {

View File

@ -7,6 +7,7 @@
#include <glm/gtc/type_ptr.hpp> #include <glm/gtc/type_ptr.hpp>
#include "render_data.h" #include "render_data.h"
#include "user_interface.h" #include "user_interface.h"
#include "timer.h"
struct Frame_Buffer { struct Frame_Buffer {
@ -51,6 +52,7 @@ struct Renderer {
Matrix4 projection_matrix = Matrix4(1.0f); Matrix4 projection_matrix = Matrix4(1.0f);
User_Interface user_interface; User_Interface user_interface;
Render_Data render_data; 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; ImGuiWindowFlags imgui_window_flags = 0;
ImGui::SetNextWindowBgAlpha(0.8f); ImGui::SetNextWindowBgAlpha(0.8f);
ImGui::Begin("Control", nullptr, imgui_window_flags); 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::Text("Triangles:");
ImGui::SameLine(); ImGui::SameLine();
ImGui::Text(std::to_string(render_data->triangle_count).c_str()); ImGui::Text(std::to_string(render_data->triangle_count).c_str());

View File

@ -3,6 +3,8 @@
#include "render_data.h" #include "render_data.h"
struct User_Interface { 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); 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); glfwSetWindowSizeCallback(window->glfw_window, handle_window_resize_events);
glfwSetWindowCloseCallback(window->glfw_window, handle_close); glfwSetWindowCloseCallback(window->glfw_window, handle_close);
glfwSetKeyCallback(window->glfw_window, handle_key_events); glfwSetKeyCallback(window->glfw_window, handle_key_events);
glfwSetCursorPosCallback(window->glfw_window, handle_mouse_position_events); // Have to disable so ImGui will accept mouse events
glfwSetMouseButtonCallback(window->glfw_window, handle_mouse_button_events); // glfwSetCursorPosCallback(window->glfw_window, handle_mouse_position_events);
// glfwSetMouseButtonCallback(window->glfw_window, handle_mouse_button_events);
window->model = new Model(); window->model = new Model();
init_model(window->model); init_model(window->model);