bevy/examples/diagnostics/log_diagnostics.rs
Rob Parrett f0047899d7
Allow users to customize history length in FrameTimeDiagnosticsPlugin (#17259)
# Objective

I have an application where I'd like to measure average frame rate over
the entire life of the application, and it would be handy if I could
just configure this on the existing `FrameTimeDiagnosticsPlugin`.

Probably fixes #10948?

## Solution

Add `max_history_length` to `FrameTimeDiagnosticsPlugin`, and because
`smoothing_factor` seems to be based on history length, add that too.

## Discussion

I'm not totally sure that `DEFAULT_MAX_HISTORY_LENGTH` is a great
default for `FrameTimeDiagnosticsPlugin` (or any diagnostic?). That's
1/3 of a second at typical game frame rates. Moreover, the default print
interval for `LogDiagnosticsPlugin` is 1 second. So when the two are
combined, you are printing the average over the last third of the
duration between now and the previous print, which seems a bit wonky.
(related: #11429)

I'm pretty sure this default value discussed and the current value
wasn't totally arbitrary though.

Maybe it would be nice for `Diagnostic` to have a
`with_max_history_length_and_also_calculate_a_good_default_smoothing_factor`
method? And then make an explicit smoothing factor in
`FrameTimeDiagnosticsPlugin` optional?

Or add a `new(max_history_length: usize)` method to
`FrameTimeDiagnosticsPlugin` that sets a reasonable default
`smoothing_factor`? edit: This one seems like a no-brainer, doing it.

## Alternatives

It's really easy to roll your own `FrameTimeDiagnosticsPlugin`, but that
might not be super interoperable with, for example, third party FPS
overlays. Still, might be the right call.

## Testing

`cargo run --example many_sprites` (modified to use a custom
`max_history_length`)

## Migration Guide

`FrameTimeDiagnosticsPlugin` now contains two fields. Use
`FrameTimeDiagnosticsPlugin::default()` to match Bevy's previous
behavior or, for example, `FrameTimeDiagnosticsPlugin::new(60)` to
configure it.
2025-01-12 18:18:14 +00:00

30 lines
1.1 KiB
Rust

//! Shows different built-in plugins that logs diagnostics, like frames per second (FPS), to the console.
use bevy::{
diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin},
prelude::*,
};
fn main() {
App::new()
.add_plugins((
DefaultPlugins,
// Adds frame time diagnostics
FrameTimeDiagnosticsPlugin::default(),
// Adds a system that prints diagnostics to the console
LogDiagnosticsPlugin::default(),
// Any plugin can register diagnostics. Uncomment this to add an entity count diagnostics:
// bevy::diagnostic::EntityCountDiagnosticsPlugin::default(),
// Uncomment this to add an asset count diagnostics:
// bevy::asset::diagnostic::AssetCountDiagnosticsPlugin::<Texture>::default(),
// Uncomment this to add system info diagnostics:
// bevy::diagnostic::SystemInformationDiagnosticsPlugin::default()
// Uncomment this to add rendering diagnostics:
// bevy::render::diagnostic::RenderDiagnosticsPlugin::default(),
))
.run();
}