mirror of
https://github.com/bevyengine/bevy
synced 2024-12-25 04:23:08 +00:00
dcc03724a5
# Objective NOTE: This depends on #7267 and should not be merged until #7267 is merged. If you are reviewing this before that is merged, I highly recommend viewing the Base Sets commit instead of trying to find my changes amongst those from #7267. "Default sets" as described by the [Stageless RFC](https://github.com/bevyengine/rfcs/pull/45) have some [unfortunate consequences](https://github.com/bevyengine/bevy/discussions/7365). ## Solution This adds "base sets" as a variant of `SystemSet`: A set is a "base set" if `SystemSet::is_base` returns `true`. Typically this will be opted-in to using the `SystemSet` derive: ```rust #[derive(SystemSet, Clone, Hash, Debug, PartialEq, Eq)] #[system_set(base)] enum MyBaseSet { A, B, } ``` **Base sets are exclusive**: a system can belong to at most one "base set". Adding a system to more than one will result in an error. When possible we fail immediately during system-config-time with a nice file + line number. For the more nested graph-ey cases, this will fail at the final schedule build. **Base sets cannot belong to other sets**: this is where the word "base" comes from Systems and Sets can only be added to base sets using `in_base_set`. Calling `in_set` with a base set will fail. As will calling `in_base_set` with a normal set. ```rust app.add_system(foo.in_base_set(MyBaseSet::A)) // X must be a normal set ... base sets cannot be added to base sets .configure_set(X.in_base_set(MyBaseSet::A)) ``` Base sets can still be configured like normal sets: ```rust app.add_system(MyBaseSet::B.after(MyBaseSet::Ap)) ``` The primary use case for base sets is enabling a "default base set": ```rust schedule.set_default_base_set(CoreSet::Update) // this will belong to CoreSet::Update by default .add_system(foo) // this will override the default base set with PostUpdate .add_system(bar.in_base_set(CoreSet::PostUpdate)) ``` This allows us to build apis that work by default in the standard Bevy style. This is a rough analog to the "default stage" model, but it use the new "stageless sets" model instead, with all of the ordering flexibility (including exclusive systems) that it provides. --- ## Changelog - Added "base sets" and ported CoreSet to use them. ## Migration Guide TODO
48 lines
1.7 KiB
Rust
48 lines
1.7 KiB
Rust
use crate::{Diagnostic, DiagnosticId, Diagnostics};
|
|
use bevy_app::prelude::*;
|
|
use bevy_core::FrameCount;
|
|
use bevy_ecs::prelude::*;
|
|
use bevy_time::Time;
|
|
|
|
/// Adds "frame time" diagnostic to an App, specifically "frame time", "fps" and "frame count"
|
|
#[derive(Default)]
|
|
pub struct FrameTimeDiagnosticsPlugin;
|
|
|
|
impl Plugin for FrameTimeDiagnosticsPlugin {
|
|
fn build(&self, app: &mut bevy_app::App) {
|
|
app.add_startup_system(Self::setup_system.in_set(StartupSet::Startup))
|
|
.add_system(Self::diagnostic_system);
|
|
}
|
|
}
|
|
|
|
impl FrameTimeDiagnosticsPlugin {
|
|
pub const FPS: DiagnosticId = DiagnosticId::from_u128(288146834822086093791974408528866909483);
|
|
pub const FRAME_COUNT: DiagnosticId =
|
|
DiagnosticId::from_u128(54021991829115352065418785002088010277);
|
|
pub const FRAME_TIME: DiagnosticId =
|
|
DiagnosticId::from_u128(73441630925388532774622109383099159699);
|
|
|
|
pub fn setup_system(mut diagnostics: ResMut<Diagnostics>) {
|
|
diagnostics.add(Diagnostic::new(Self::FRAME_TIME, "frame_time", 20).with_suffix("ms"));
|
|
diagnostics.add(Diagnostic::new(Self::FPS, "fps", 20));
|
|
diagnostics
|
|
.add(Diagnostic::new(Self::FRAME_COUNT, "frame_count", 1).with_smoothing_factor(0.0));
|
|
}
|
|
|
|
pub fn diagnostic_system(
|
|
mut diagnostics: ResMut<Diagnostics>,
|
|
time: Res<Time>,
|
|
frame_count: Res<FrameCount>,
|
|
) {
|
|
diagnostics.add_measurement(Self::FRAME_COUNT, || frame_count.0 as f64);
|
|
|
|
let delta_seconds = time.raw_delta_seconds_f64();
|
|
if delta_seconds == 0.0 {
|
|
return;
|
|
}
|
|
|
|
diagnostics.add_measurement(Self::FRAME_TIME, || delta_seconds * 1000.0);
|
|
|
|
diagnostics.add_measurement(Self::FPS, || 1.0 / delta_seconds);
|
|
}
|
|
}
|