Adds update interval config for FpsOverlayPlugin (#17489)

# Objective
Fixes #17487 

- Adds a new field `refresh_interval` to `FpsOverlayConfig` to allow the
user setting a minimum time before each refresh of the FPS display

## Solution

- Add `refresh_interval` to `FpsOverlayConfig`
- When updating the on screen text, check a duration of
`refresh_interval` has passed, if not, don't update the FPS counter

## Testing

- Created a new bevy project
- Included the `FpsOverlayPlugin` with the default `refresh_interval`
(100 ms)
- Included the `FpsOverlayPlugin` with an obnoxious `refresh_interval`
(2 seconds)
---

---------

Co-authored-by: Benjamin Brienen <benjamin.brienen@outlook.com>
Co-authored-by: Alice Cecile <alice.i.cecile@gmail.com>
This commit is contained in:
spvky 2025-01-24 00:57:36 -05:00 committed by GitHub
parent af3a84fc0b
commit 40007cdb2e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 4 deletions

View File

@ -8,6 +8,7 @@ use bevy_ecs::{
change_detection::DetectChangesMut,
component::Component,
entity::Entity,
prelude::Local,
query::With,
resource::Resource,
schedule::{common_conditions::resource_changed, IntoSystemConfigs},
@ -15,10 +16,12 @@ use bevy_ecs::{
};
use bevy_render::view::Visibility;
use bevy_text::{Font, TextColor, TextFont, TextSpan};
use bevy_time::Time;
use bevy_ui::{
widget::{Text, TextUiWriter},
GlobalZIndex, Node, PositionType,
};
use core::time::Duration;
/// [`GlobalZIndex`] used to render the fps overlay.
///
@ -65,6 +68,10 @@ pub struct FpsOverlayConfig {
pub text_color: Color,
/// Displays the FPS overlay if true.
pub enabled: bool,
/// The period after which the FPS overlay re-renders.
///
/// Defaults to once every 100 ms.
pub refresh_interval: Duration,
}
impl Default for FpsOverlayConfig {
@ -77,6 +84,7 @@ impl Default for FpsOverlayConfig {
},
text_color: Color::WHITE,
enabled: true,
refresh_interval: Duration::from_millis(100),
}
}
}
@ -110,11 +118,18 @@ fn update_text(
diagnostic: Res<DiagnosticsStore>,
query: Query<Entity, With<FpsText>>,
mut writer: TextUiWriter,
time: Res<Time>,
config: Res<FpsOverlayConfig>,
mut time_since_rerender: Local<Duration>,
) {
for entity in &query {
if let Some(fps) = diagnostic.get(&FrameTimeDiagnosticsPlugin::FPS) {
if let Some(value) = fps.smoothed() {
*writer.text(entity, 1) = format!("{value:.2}");
*time_since_rerender += time.delta();
if *time_since_rerender >= config.refresh_interval {
*time_since_rerender = Duration::ZERO;
for entity in &query {
if let Some(fps) = diagnostic.get(&FrameTimeDiagnosticsPlugin::FPS) {
if let Some(value) = fps.smoothed() {
*writer.text(entity, 1) = format!("{value:.2}");
}
}
}
}

View File

@ -30,6 +30,8 @@ fn main() {
},
// We can also change color of the overlay
text_color: OverlayColor::GREEN,
// We can also set the refresh interval for the FPS counter
refresh_interval: core::time::Duration::from_millis(100),
enabled: true,
},
},