Skip to content

Commit

Permalink
Build SelectedFrames from iterator
Browse files Browse the repository at this point in the history
  • Loading branch information
andreiltd committed Jun 28, 2024
1 parent 0831946 commit 7d24cbf
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 18 deletions.
18 changes: 11 additions & 7 deletions puffin/src/profile_view.rs
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
use itertools::Itertools;
use std::{cmp::Ordering, sync::Arc};
use std::{
cmp::Ordering,
collections::{BTreeSet, VecDeque},
sync::Arc,
};

use crate::{FrameData, FrameSinkId, ScopeCollection};

/// A view of recent and slowest frames, used by GUIs.
#[derive(Clone)]
pub struct FrameView {
/// newest first
recent: std::collections::VecDeque<OrderedByIndex>,
recent: VecDeque<OrderedByIndex>,
max_recent: usize,

slowest_by_index: std::collections::BTreeSet<OrderedByIndex>,
slowest_by_duration: std::collections::BTreeSet<OrderedByDuration>,
slowest_by_index: BTreeSet<OrderedByIndex>,
slowest_by_duration: BTreeSet<OrderedByDuration>,
max_slow: usize,

/// Minimizes memory usage at the expense of CPU time.
Expand All @@ -31,10 +35,10 @@ impl Default for FrameView {
let max_slow = 256;

Self {
recent: std::collections::VecDeque::with_capacity(max_recent),
recent: VecDeque::with_capacity(max_recent),
max_recent,
slowest_by_index: std::collections::BTreeSet::new(),
slowest_by_duration: std::collections::BTreeSet::new(),
slowest_by_index: BTreeSet::new(),
slowest_by_duration: BTreeSet::new(),
max_slow,
pack_frames: true,
stats: Default::default(),
Expand Down
26 changes: 15 additions & 11 deletions puffin_egui/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ use puffin::*;
use std::{
collections::{BTreeMap, BTreeSet},
fmt::Write as _,
iter,
sync::Arc,
};
use time::OffsetDateTime;
Expand Down Expand Up @@ -211,11 +212,15 @@ pub struct SelectedFrames {
}

impl SelectedFrames {
fn try_from_vec(
fn try_from_iter(
scope_collection: &ScopeCollection,
frames: Vec<Arc<UnpackedFrameData>>,
frames: impl Iterator<Item = Arc<UnpackedFrameData>>,
) -> Option<Self> {
let frames = vec1::Vec1::try_from_vec(frames).ok()?;
let mut it = frames;
let first = it.next()?;
let mut frames = vec1::Vec1::new(first);
frames.extend(it);

Some(Self::from_vec1(scope_collection, frames))
}

Expand Down Expand Up @@ -450,7 +455,7 @@ impl ProfilerUi {
let frames = if let Some(frame) = hovered_frame {
match frame.unpacked() {
Ok(frame) => {
SelectedFrames::try_from_vec(frame_view.scope_collection(), vec![frame])
SelectedFrames::try_from_iter(frame_view.scope_collection(), iter::once(frame))
}
Err(err) => {
ui.colored_label(ERROR_COLOR, format!("Failed to load hovered frame: {err}"));
Expand All @@ -461,13 +466,12 @@ impl ProfilerUi {
Some(paused.selected.clone())
} else {
puffin::profile_scope!("select_latest_frames");
let latest = frame_view.latest_frames(self.max_num_latest);
let unpacked: Vec<Arc<UnpackedFrameData>> = latest
.into_iter()
let latest = frame_view
.latest_frames(self.max_num_latest)
.map(|frame| frame.unpacked())
.filter_map(|unpacked| unpacked.ok())
.collect();
SelectedFrames::try_from_vec(frame_view.scope_collection(), unpacked)
.filter_map(|unpacked| unpacked.ok());

SelectedFrames::try_from_iter(frame_view.scope_collection(), latest)
};

let frames = if let Some(frames) = frames {
Expand Down Expand Up @@ -760,7 +764,7 @@ impl ProfilerUi {
}

if let Some(new_selection) =
SelectedFrames::try_from_vec(frame_view.scope_collection(), new_selection)
SelectedFrames::try_from_iter(frame_view.scope_collection(), new_selection.into_iter())
{
self.pause_and_select(frame_view, new_selection);
}
Expand Down

0 comments on commit 7d24cbf

Please sign in to comment.