Skip to content

Commit

Permalink
Add setting for grid spacing on temporal axis (EmbarkStudios#195)
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
chrisduerr and emilk authored Jul 31, 2024
1 parent 2b5b8b4 commit 8ac2733
Showing 1 changed file with 17 additions and 2 deletions.
19 changes: 17 additions & 2 deletions puffin_egui/src/flamegraph.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ pub struct Options {
/// Visual settings for threads.
pub flamegraph_threads: IndexMap<String, ThreadVisualizationSettings>,

/// Interval of vertical timeline indicators.
grid_spacing_micros: f64,

#[cfg_attr(feature = "serde", serde(skip))]
filter: Filter,

Expand All @@ -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(),

Expand Down Expand Up @@ -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| {
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 8ac2733

Please sign in to comment.