pub struct PerformancePolicy {
pub preset: Option<QualityPreset>,
pub target_fps: Option<f32>,
pub min_render_scale: f32,
pub max_render_scale: f32,
pub allow_dynamic_resolution: bool,
pub allow_shadow_reduction: bool,
pub allow_volume_quality_reduction: bool,
pub allow_effect_throttling: bool,
}Expand description
Controls what quality reductions the viewport is allowed to apply under load.
Set once via crate::ViewportRenderer::set_performance_policy. The internal
adaptation controller reads target_fps and adjusts render scale within
[min_render_scale, max_render_scale] when allow_dynamic_resolution is true.
Pass-specific flags (allow_shadow_reduction, allow_volume_quality_reduction,
allow_effect_throttling) gate concrete quality reductions that kick in when
the previous frame missed the target budget, applied in order via a tiered
degradation ladder (render scale first, then shadows, then volumes, then effects).
Set preset to a QualityPreset to configure bounds and flags as a unit.
Fields§
§preset: Option<QualityPreset>Coarse quality tier. When Some, overrides min_render_scale,
max_render_scale, and all allow_* flags for the duration of the frame.
Set to None to use the individual fields directly.
target_fps: Option<f32>Target frames per second. None means uncapped; missed_budget is always false.
min_render_scale: f32Lower bound for dynamic render scale (e.g. 0.5 = half resolution).
Ignored when preset is Some; the preset’s bounds are used instead.
max_render_scale: f32Upper bound for dynamic render scale (1.0 = native).
Ignored when preset is Some; the preset’s bounds are used instead.
allow_dynamic_resolution: boolAllow the viewport to adjust render scale automatically when budget is exceeded.
When false, the internal controller is inactive and render scale can be
set manually via crate::ViewportRenderer::set_render_scale.
The controller uses FrameStats::gpu_frame_ms as the cost signal when GPU
timestamp queries are available (excludes vsync wait). When GPU timestamps are
unavailable it falls back to total_frame_ms, which reflects wall-clock frame
duration and correctly fires over-budget at low frame rates.
LDR path only. Dynamic resolution applies when the scene is rendered
via crate::ViewportRenderer::paint_to or
crate::ViewportRenderer::paint_viewport (i.e.
PostProcessSettings::enabled is false). When the HDR post-processing
path is active (render / render_viewport), render scale has no effect
on output quality and the adaptation controller is suppressed.
FrameStats::render_scale will report 1.0 in that case.
allow_shadow_reduction: boolAllow the viewport to skip the shadow pass under load.
When true and the previous frame exceeded the target budget, the shadow depth
pass is skipped entirely. Shadows reappear as soon as the frame is within budget.
Ignored when preset is Some.
allow_volume_quality_reduction: boolAllow the viewport to reduce volume raymarch quality under load.
When true and the previous frame exceeded the target budget, the per-volume
step size is doubled (half the number of samples), reducing GPU cost at the
cost of coarser volume appearance. Ignored when preset is Some.
allow_effect_throttling: boolAllow the viewport to skip non-essential HDR effect passes under load.
When true and the previous frame exceeded the target budget, the SSAO,
contact shadow, and bloom passes are skipped for that frame.
Ignored when preset is Some.
Trait Implementations§
Source§impl Clone for PerformancePolicy
impl Clone for PerformancePolicy
Source§fn clone(&self) -> PerformancePolicy
fn clone(&self) -> PerformancePolicy
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for PerformancePolicy
impl Debug for PerformancePolicy
Source§impl Default for PerformancePolicy
impl Default for PerformancePolicy
Source§impl<'de> Deserialize<'de> for PerformancePolicy
impl<'de> Deserialize<'de> for PerformancePolicy
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for PerformancePolicy
impl PartialEq for PerformancePolicy
Source§fn eq(&self, other: &PerformancePolicy) -> bool
fn eq(&self, other: &PerformancePolicy) -> bool
self and other values to be equal, and is used by ==.Source§impl Serialize for PerformancePolicy
impl Serialize for PerformancePolicy
impl Copy for PerformancePolicy
impl StructuralPartialEq for PerformancePolicy
Auto Trait Implementations§
impl Freeze for PerformancePolicy
impl RefUnwindSafe for PerformancePolicy
impl Send for PerformancePolicy
impl Sync for PerformancePolicy
impl Unpin for PerformancePolicy
impl UnsafeUnpin for PerformancePolicy
impl UnwindSafe for PerformancePolicy
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&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> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.