From 8ac27337cd7e326730788ce1b70012c59c2605dc Mon Sep 17 00:00:00 2001 From: Christian Duerr Date: Wed, 31 Jul 2024 11:38:14 +0200 Subject: [PATCH] Add setting for grid spacing on temporal axis (#195) Add the ability to change the spacing of the x-axis indicators from the default 10ms to an arbitrary interval. This is particularly useful to determine when a frame misses its desired vblank. --- This change is primarily motivated by my own necessity to easily determine when a particular frame ran for over ~16ms and specifically which part of the flamegraph caused it to stretch beyond that limit. It's probably not the ideal solution, but I wanted to open up a PR to see if there's any interest in this feature from upstream. One particularity of the current implementation is that 1, 10, 100, and 1000 all behave the same, since the interval is somewhat relative to the current viewport's width. I don't care about this since it doesn't really make a difference (you just need to zoom in/out), but I can see how that might be an undesired user experience. https://github.com/EmbarkStudios/puffin/assets/8886672/6277f290-f93b-4603-bd58-3abd4c54d41c --------- Co-authored-by: Emil Ernerfeldt --- puffin_egui/src/flamegraph.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/puffin_egui/src/flamegraph.rs b/puffin_egui/src/flamegraph.rs index 6eed6a80..24f05861 100644 --- a/puffin_egui/src/flamegraph.rs +++ b/puffin_egui/src/flamegraph.rs @@ -124,6 +124,9 @@ pub struct Options { /// Visual settings for threads. pub flamegraph_threads: IndexMap, + /// Interval of vertical timeline indicators. + grid_spacing_micros: f64, + #[cfg_attr(feature = "serde", serde(skip))] filter: Filter, @@ -148,10 +151,12 @@ impl Default for Options { rounding: 4.0, frame_list_height: 48.0, - frame_width: 10.0, + frame_width: 10., merge_scopes: false, // off, because it really only works well for single-threaded profiling + grid_spacing_micros: 1., + sorting: Default::default(), filter: Default::default(), @@ -256,6 +261,16 @@ pub fn ui( }); options.filter.ui(ui); + + // Grid spacing interval selector. + ui.horizontal(|ui| { + ui.label("Grid spacing:"); + let grid_spacing_drag = DragValue::new(&mut options.grid_spacing_micros) + .speed(0.1) + .clamp_range(1.0..=100.0) + .suffix(" µs"); + grid_spacing_drag.ui(ui); + }); }); ui.collapsing("Visible Threads", |ui| { @@ -505,7 +520,7 @@ fn paint_timeline( // We show all measurements relative to start_ns let max_lines = canvas.width() / 4.0; - let mut grid_spacing_ns = 1_000; + let mut grid_spacing_ns = (options.grid_spacing_micros * 1_000.) as i64; while options.canvas_width_ns / (grid_spacing_ns as f32) > max_lines { grid_spacing_ns *= 10; }