Skip to main content

FrameStats

Struct FrameStats 

Source
pub struct FrameStats {
Show 33 fields pub total_objects: u32, pub visible_objects: u32, pub culled_objects: u32, pub draw_calls: u32, pub instanced_batches: u32, pub per_object_items: u32, pub per_object_bind_groups_built: u32, pub batches_reuploaded: u32, pub batches_skipped: u32, pub decal_uploads: u32, pub decal_reused: u32, pub triangles_submitted: u64, pub shadow_draw_calls: u32, pub cpu_prepare_ms: f32, pub prepare_breakdown: PrepareBreakdown, pub cpu_paint_ms: f32, pub gpu_frame_ms: Option<f32>, pub gpu_breakdown: GpuBreakdown, pub total_frame_ms: f32, pub render_scale: f32, pub missed_budget: bool, pub upload_bytes: u64, pub gpu_culling_active: bool, pub gpu_visible_instances: Option<u32>, pub gpu_culled_total: Option<u32>, pub gpu_frustum_visible: Option<u32>, pub shadows_skipped: bool, pub volume_quality_reduced: bool, pub effects_throttled: bool, pub lod_items_resolved: u32, pub lod_switches: u32, pub lod_culled: u32, pub lod_items_reduced: u32,
}
Expand description

Per-frame rendering statistics returned by crate::ViewportRenderer::prepare.

Fields§

§total_objects: u32

Total objects considered for rendering.

§visible_objects: u32

Objects that passed visibility and frustum tests.

§culled_objects: u32

Objects culled by frustum or visibility.

§draw_calls: u32

Number of draw calls issued in the main pass.

§instanced_batches: u32

Number of instanced batches (0 when using per-object path).

§per_object_items: u32

Visible items that miss the instanced fast path and are drawn one at a time through the per-object path.

An item is non-instanceable when it uses a styled back-face policy (different-colour/tint/pattern) or is two-sided and transparent, uses a matcap, has a scalar attribute or parameter visualization, carries a position/normal override, has per-instance deform data (skinning), or is hit by a compute filter. Each such item costs a uniform write and a bind-group build in prepare, so a large count here means prepare is paying per-object cost across much of the scene rather than batching it.

§per_object_bind_groups_built: u32

Per-object bind groups actually (re)built this frame.

The per-object path caches bind groups and skips the rebuild when the item’s textures, attributes, and overrides are unchanged. A value near per_object_items means the cache is missing most frames (for example because items move between slots); a value near zero means the remaining per-object cost is the uniform writes, not the bind-group builds.

§batches_reuploaded: u32

Instanced batches whose GPU sub-range was re-uploaded this frame.

Non-zero only on cache-miss frames where at least one batch’s instance data changed. Zero on cache-hit frames and when the per-object path is active. Together with batches_skipped, this lets callers measure how effective the dirty-flagging optimisation is for their scene.

§batches_skipped: u32

Instanced batches whose GPU sub-range was reused unchanged this frame.

Non-zero only on cache-miss frames where at least one batch compared equal to the cached data and its write was skipped. Zero on cache-hit frames (no upload attempted at all) and when the per-object path is active.

§decal_uploads: u32

Decals whose GPU buffer + bind group were built this frame (cache miss).

Non-zero only when a decal is new or its content changed. In steady state with static decals this is zero after the first frame: a persistent value near the decal count means the cache is missing every frame.

§decal_reused: u32

Decals served from the cross-frame cache this frame (cache hit).

Together with decal_uploads this shows how effective the decal resource cache is: decal_reused should equal the visible decal count and decal_uploads should be zero once decals are settled.

§triangles_submitted: u64

Total triangles submitted to the GPU.

§shadow_draw_calls: u32

Number of draw calls in the shadow pass.

§cpu_prepare_ms: f32

CPU time spent in prepare(), in milliseconds.

§prepare_breakdown: PrepareBreakdown

Per-phase split of cpu_prepare_ms. See PrepareBreakdown.

§cpu_paint_ms: f32

CPU time spent encoding the paint pass (draw-call recording) in milliseconds, separate from cpu_prepare_ms.

Measured around the render/paint encode and latched after it, so last_frame_stats() reflects the current frame once render has run. The value carried in the FrameStats returned by prepare() is the previous frame’s paint, since paint runs after prepare. For multi-viewport rendering this reflects the most recently painted viewport, not the sum.

§gpu_frame_ms: Option<f32>

GPU scene-pass time in milliseconds, if timestamp queries are available.

Measured with TIMESTAMP_QUERY around the main scene render pass. None on backends that do not support TIMESTAMP_QUERY (e.g. WebGL).

Note: this value reflects the previous frame’s GPU cost due to async readback. The value lags by one frame and should not be used by the adaptation controller across mode transitions.

§gpu_breakdown: GpuBreakdown

Per-pass split of GPU frame time. See GpuBreakdown.

Populated under the same conditions as gpu_frame_ms (requires TIMESTAMP_QUERY); all fields are 0.0 otherwise. scene_ms matches gpu_frame_ms.

§total_frame_ms: f32

Wall-clock duration since the previous prepare() call, in milliseconds.

Approximates the full frame interval. Zero on the first frame.

§render_scale: f32

Current internal render scale (1.0 = native resolution).

Reflects the value tracked by the adaptation controller. Values below 1.0 cause the scene to render into a scaled intermediate texture that is bilinearly upscaled to the surface (requires allow_dynamic_resolution).

§missed_budget: bool

True if the last frame exceeded the target frame budget.

Requires target_fps to be set in the PerformancePolicy. Always false when no target is configured.

§upload_bytes: u64

Bytes of geometry data uploaded to the GPU since the previous prepare() call.

Counts full buffer reallocations triggered by crate::DeviceResources::replace_mesh_data and initial uploads via upload_mesh_data / upload_mesh. Uniform buffer writes are not counted.

§gpu_culling_active: bool

True when GPU-driven culling is active this frame.

False when the device does not support INDIRECT_FIRST_INSTANCE or culling has been disabled via disable_gpu_driven_culling().

§gpu_visible_instances: Option<u32>

Number of instances that passed GPU culling and were submitted for drawing.

This is the count after both the frustum and occlusion tests. Populated only when gpu_culling_active is true. None on the first frame or when GPU culling is off. Lags by one frame due to async readback.

§gpu_culled_total: Option<u32>

Total instances considered by the main-camera cull this frame, before any test. Same readback and None conditions as gpu_visible_instances.

§gpu_frustum_visible: Option<u32>

Instances that survived the frustum test, before the HiZ occlusion test.

gpu_culled_total - gpu_frustum_visible is the frustum-culled count, and gpu_frustum_visible - gpu_visible_instances is the occlusion-culled count. When occlusion culling is off, this equals gpu_visible_instances. Same readback and None conditions as gpu_visible_instances.

§shadows_skipped: bool

True when the shadow depth pass was skipped this frame.

Set when allow_shadow_reduction is true and the previous frame missed the target budget. Always false in RuntimeMode::Capture.

§volume_quality_reduced: bool

True when volume raymarch step size was doubled this frame.

Set when allow_volume_quality_reduction is true and the previous frame missed the target budget. Always false in RuntimeMode::Capture.

§effects_throttled: bool

True when SSAO, contact shadows, and bloom were skipped this frame.

Set when allow_effect_throttling is true and the previous frame missed the target budget. Always false in RuntimeMode::Capture.

§lod_items_resolved: u32

Objects that resolved through a LOD group this frame.

Counts SceneRenderItems with a lod_group set, plus each individual MeshInstanceItem instance whose level was selected. Zero when nothing uses LOD.

§lod_switches: u32

LOD objects whose chosen level changed from the previous frame.

Counts both scene items and individual mesh instances that moved to a different level. Only objects with a pick_id are tracked across frames, so this counts switches among those. A high value relative to lod_items_resolved suggests thresholds are being crossed often (camera motion, or thresholds spaced too tightly for the hysteresis margin).

§lod_culled: u32

Objects dropped this frame because they fell below their LOD group’s cull size. Counts hidden SceneRenderItems plus individual mesh instances that were left out of every batch. Zero unless a group sets cull_below.

§lod_items_reduced: u32

LOD objects drawn this frame at a reduced level (level index > 0, i.e. below full detail). Counts scene items plus individual mesh instances.

Unlike lod_switches, this does not need per-object tracking, so it is accurate for objects with no pick_id. It is the reliable signal for “is LOD actually reducing geometry”: if it stays near zero while distant objects fill the view, either the heavy meshes are not in LOD groups or the min_screen_size thresholds never trigger, and the triangle count is not coming down.

Trait Implementations§

Source§

impl Clone for FrameStats

Source§

fn clone(&self) -> FrameStats

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for FrameStats

Source§

impl Debug for FrameStats

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for FrameStats

Source§

fn default() -> FrameStats

Returns the “default value” for a type. Read more

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> DowncastSend for T
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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,

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more