Skip to main content

FrameTimer

Struct FrameTimer 

Source
pub struct FrameTimer {
    pub histogram: FrameHistogram,
    pub mode: FrameTimerMode,
    /* private fields */
}
Expand description

GPU frame timer with CPU fallback.

Record the start of a frame with FrameTimer::begin_frame and the end with FrameTimer::end_frame. After each frame the duration is pushed to the internal FrameHistogram. Call FrameTimer::recommend_present_mode to get an adaptive present-mode suggestion.

When TIMESTAMP_QUERY is available, a QuerySet with two entries is used for sub-millisecond GPU-side measurements. Otherwise, CPU Instant is used as a coarser fallback.

Fields§

§histogram: FrameHistogram

The rolling frame-time histogram.

§mode: FrameTimerMode

How this timer measures time.

Implementations§

Source§

impl FrameTimer

Source

pub fn new(device: &Device, queue: &Queue, target_fps: u32) -> Self

Create a new frame timer.

If device.features() contains TIMESTAMP_QUERY, GPU-side timing is used. Otherwise, the timer falls back to CPU Instant.

target_fps is used to compute target_frame for the present-mode heuristic. Pass 60 for a standard 60 Hz target.

Source

pub fn begin_frame(&mut self, encoder: &mut CommandEncoder)

Record the start of a frame.

In GPU mode, encoder should be the first encoder for the frame. In CPU fallback mode, encoder is ignored.

Source

pub fn end_frame(&mut self, encoder: &mut CommandEncoder)

Record the end of a frame.

In GPU mode, encoder should be the last encoder for the frame (after all render passes). Call resolve after submitting the encoder to copy the timestamps to the readback buffer.

Source

pub fn resolve_timestamps(&mut self, encoder: &mut CommandEncoder)

Resolve GPU timestamps to the readback buffer.

Call this in a separate encoder submitted immediately after the frame encoder. The resolve copy is a GPU operation that must follow the write_timestamp commands in the previous encoder.

No-op in CPU fallback mode or if no GPU query is pending.

Source

pub fn collect_gpu_timestamps(&mut self, device: &Device)

Read back the GPU timestamps (if available) and update the histogram.

Must be called after the resolve encoder has been submitted and the GPU has completed (e.g. after device.poll(Wait)).

No-op in CPU fallback mode or if no GPU query is pending.

Source

pub fn recommend_present_mode(&self) -> PresentModeRecommendation

Recommend a wgpu::PresentMode based on the recent frame-time histogram.

Requires at least 4 samples to make a recommendation; returns Fifo until then.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,