diff --git a/implementations/Crafter.Graphics-Window.cpp b/implementations/Crafter.Graphics-Window.cpp index 1c0f1b5..ef5efdf 100644 --- a/implementations/Crafter.Graphics-Window.cpp +++ b/implementations/Crafter.Graphics-Window.cpp @@ -71,7 +71,30 @@ void Window::LogTiming() { for (const std::tuple& entry : renderTimings) { std::cout << std::format("\t{} {}x{} {}", reinterpret_cast(std::get<0>(entry)), std::get<1>(entry), std::get<2>(entry), duration_cast(std::get<3>(entry))) << std::endl; } + std::cout << std::format("Total: {}", duration_cast(totalUpdate+totalRender)) << std::endl; std::cout << std::format("Vblank: {}", duration_cast(vblank)) << std::endl; - std::cout << std::format("Total: {}", duration_cast(totalUpdate+totalRender+vblank)) << std::endl; + + // Add 100-frame average and min-max timing info + if (!frameTimes.empty()) { + // Calculate average + std::chrono::nanoseconds sum(0); + for (const auto& frameTime : frameTimes) { + sum += frameTime; + } + auto average = sum / frameTimes.size(); + + // Find min and max + auto min = frameTimes.front(); + auto max = frameTimes.front(); + for (const auto& frameTime : frameTimes) { + if (frameTime < min) min = frameTime; + if (frameTime > max) max = frameTime; + } + + std::cout << std::format("Last 100 Frame Times - Avg: {}, Min: {}, Max: {}", + duration_cast(average), + duration_cast(min), + duration_cast(max)) << std::endl; + } } #endif \ No newline at end of file diff --git a/implementations/Crafter.Graphics-Window_wayland.cpp b/implementations/Crafter.Graphics-Window_wayland.cpp index 0a2afb1..5ceec36 100644 --- a/implementations/Crafter.Graphics-Window_wayland.cpp +++ b/implementations/Crafter.Graphics-Window_wayland.cpp @@ -278,6 +278,13 @@ void WindowWayland::wl_surface_frame_done(void* data, struct wl_callback *cb, ui #ifdef CRAFTER_TIMING window->frameEnd = std::chrono::high_resolution_clock::now(); + + window->frameTimes.push_back(window->totalUpdate+window->totalRender); + + // Keep only the last 100 frame times + if (window->frameTimes.size() > 100) { + window->frameTimes.erase(window->frameTimes.begin()); + } #endif window->lastFrameBegin = start; } diff --git a/interfaces/Crafter.Graphics-Window.cppm b/interfaces/Crafter.Graphics-Window.cppm index acfc4a9..4cd77dc 100644 --- a/interfaces/Crafter.Graphics-Window.cppm +++ b/interfaces/Crafter.Graphics-Window.cppm @@ -77,6 +77,7 @@ export namespace Crafter { std::chrono::nanoseconds vblank; std::chrono::nanoseconds totalFrame; std::chrono::time_point frameEnd; + std::vector frameTimes; void LogTiming(); #endif };