Rename apply_system_buffers to apply_deferred (#8726)

# Objective

- `apply_system_buffers` is an unhelpful name: it introduces a new
internal-only concept
- this is particularly rough for beginners as reasoning about how
commands work is a critical stumbling block

## Solution

- rename `apply_system_buffers` to the more descriptive `apply_deferred`
- rename related fields, arguments and methods in the internals fo
bevy_ecs for consistency
- update the docs


## Changelog

`apply_system_buffers` has been renamed to `apply_deferred`, to more
clearly communicate its intent and relation to `Deferred` system
parameters like `Commands`.

## Migration Guide

- `apply_system_buffers` has been renamed to `apply_deferred`
- the `apply_system_buffers` method on the `System` trait has been
renamed to `apply_deferred`
- the `is_apply_system_buffers` function has been replaced by
`is_apply_deferred`
- `Executor::set_apply_final_buffers` is now
`Executor::set_apply_final_deferred`
- `Schedule::apply_system_buffers` is now `Schedule::apply_deferred`

---------

Co-authored-by: JoJoJet <21144246+JoJoJet@users.noreply.github.com>
This commit is contained in:
Alice Cecile 2023-06-02 10:04:13 -04:00 committed by GitHub
parent 6b4c7d5d88
commit cbd4abf0fc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 102 additions and 107 deletions

View file

@ -1043,12 +1043,12 @@ category = "ECS (Entity Component System)"
wasm = false wasm = false
[[example]] [[example]]
name = "apply_system_buffers" name = "apply_deferred"
path = "examples/ecs/apply_system_buffers.rs" path = "examples/ecs/apply_deferred.rs"
[package.metadata.example.apply_system_buffers] [package.metadata.example.apply_deferred]
name = "Apply System Buffers" name = "Apply System Buffers"
description = "Show how to use `apply_system_buffers` system" description = "Show how to use `apply_deferred` system"
category = "ECS (Entity Component System)" category = "ECS (Entity Component System)"
wasm = false wasm = false

View file

@ -316,7 +316,7 @@ impl<'a, 'w, 's, E: Event> IntoIterator for &'a mut EventReader<'w, 's, E> {
/// // custom events to unknown 3rd party plugins (modding API). /// // custom events to unknown 3rd party plugins (modding API).
/// // /// //
/// // NOTE: the event won't actually be sent until commands get applied during /// // NOTE: the event won't actually be sent until commands get applied during
/// // apply_system_buffers. /// // apply_deferred.
/// commands.add(|w: &mut World| { /// commands.add(|w: &mut World| {
/// w.send_event(MyEvent); /// w.send_event(MyEvent);
/// }); /// });

View file

@ -39,7 +39,7 @@ pub mod prelude {
query::{Added, AnyOf, Changed, Or, QueryState, With, Without}, query::{Added, AnyOf, Changed, Or, QueryState, With, Without},
removal_detection::RemovedComponents, removal_detection::RemovedComponents,
schedule::{ schedule::{
apply_state_transition, apply_system_buffers, common_conditions::*, Condition, apply_deferred, apply_state_transition, common_conditions::*, Condition,
IntoSystemConfigs, IntoSystemSet, IntoSystemSetConfig, IntoSystemSetConfigs, NextState, IntoSystemConfigs, IntoSystemSet, IntoSystemSetConfig, IntoSystemSetConfigs, NextState,
OnEnter, OnExit, OnTransition, Schedule, Schedules, State, States, SystemSet, OnEnter, OnExit, OnTransition, Schedule, Schedules, State, States, SystemSet,
}, },

View file

@ -1042,8 +1042,8 @@ where
!self.condition.run(input, world) !self.condition.run(input, world)
} }
fn apply_buffers(&mut self, world: &mut World) { fn apply_deferred(&mut self, world: &mut World) {
self.condition.apply_buffers(world); self.condition.apply_deferred(world);
} }
fn initialize(&mut self, world: &mut World) { fn initialize(&mut self, world: &mut World) {

View file

@ -19,7 +19,7 @@ pub(super) trait SystemExecutor: Send + Sync {
fn kind(&self) -> ExecutorKind; fn kind(&self) -> ExecutorKind;
fn init(&mut self, schedule: &SystemSchedule); fn init(&mut self, schedule: &SystemSchedule);
fn run(&mut self, schedule: &mut SystemSchedule, world: &mut World); fn run(&mut self, schedule: &mut SystemSchedule, world: &mut World);
fn set_apply_final_buffers(&mut self, value: bool); fn set_apply_final_deferred(&mut self, value: bool);
} }
/// Specifies how a [`Schedule`](super::Schedule) will be run. /// Specifies how a [`Schedule`](super::Schedule) will be run.
@ -35,7 +35,7 @@ pub enum ExecutorKind {
/// other things, or just trying minimize overhead. /// other things, or just trying minimize overhead.
#[cfg_attr(target_arch = "wasm32", default)] #[cfg_attr(target_arch = "wasm32", default)]
SingleThreaded, SingleThreaded,
/// Like [`SingleThreaded`](ExecutorKind::SingleThreaded) but calls [`apply_buffers`](crate::system::System::apply_buffers) /// Like [`SingleThreaded`](ExecutorKind::SingleThreaded) but calls [`apply_deferred`](crate::system::System::apply_deferred)
/// immediately after running each system. /// immediately after running each system.
Simple, Simple,
/// Runs the schedule using a thread pool. Non-conflicting systems can run in parallel. /// Runs the schedule using a thread pool. Non-conflicting systems can run in parallel.
@ -77,18 +77,19 @@ impl SystemSchedule {
} }
} }
/// Instructs the executor to call [`apply_buffers`](crate::system::System::apply_buffers) /// Instructs the executor to call [`System::apply_deferred`](crate::system::System::apply_deferred)
/// on the systems that have run but not applied their buffers. /// on the systems that have run but not applied their [`Deferred`](crate::system::Deferred) system parameters (like [`Commands`](crate::prelude::Commands)) or other system buffers.
/// ///
/// **Notes** /// **Notes**
/// - This function (currently) does nothing if it's called manually or wrapped inside a [`PipeSystem`](crate::system::PipeSystem). /// - This function (currently) does nothing if it's called manually or wrapped inside a [`PipeSystem`](crate::system::PipeSystem).
/// - Modifying a [`Schedule`](super::Schedule) may change the order buffers are applied. /// - Modifying a [`Schedule`](super::Schedule) may change the order buffers are applied.
#[doc(alias = "apply_system_buffers")]
#[allow(unused_variables)] #[allow(unused_variables)]
pub fn apply_system_buffers(world: &mut World) {} pub fn apply_deferred(world: &mut World) {}
/// Returns `true` if the [`System`](crate::system::System) is an instance of [`apply_system_buffers`]. /// Returns `true` if the [`System`](crate::system::System) is an instance of [`apply_deferred`].
pub(super) fn is_apply_system_buffers(system: &BoxedSystem) -> bool { pub(super) fn is_apply_deferred(system: &BoxedSystem) -> bool {
use std::any::Any; use std::any::Any;
// deref to use `System::type_id` instead of `Any::type_id` // deref to use `System::type_id` instead of `Any::type_id`
system.as_ref().type_id() == apply_system_buffers.type_id() system.as_ref().type_id() == apply_deferred.type_id()
} }

View file

@ -17,9 +17,7 @@ use crate::{
archetype::ArchetypeComponentId, archetype::ArchetypeComponentId,
prelude::Resource, prelude::Resource,
query::Access, query::Access,
schedule::{ schedule::{is_apply_deferred, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule},
is_apply_system_buffers, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule,
},
system::BoxedSystem, system::BoxedSystem,
world::{unsafe_world_cell::UnsafeWorldCell, World}, world::{unsafe_world_cell::UnsafeWorldCell, World},
}; };
@ -108,8 +106,8 @@ pub struct MultiThreadedExecutor {
completed_systems: FixedBitSet, completed_systems: FixedBitSet,
/// Systems that have run but have not had their buffers applied. /// Systems that have run but have not had their buffers applied.
unapplied_systems: FixedBitSet, unapplied_systems: FixedBitSet,
/// Setting when true applies system buffers after all systems have run /// Setting when true applies deferred system buffers after all systems have run
apply_final_buffers: bool, apply_final_deferred: bool,
/// When set, tells the executor that a thread has panicked. /// When set, tells the executor that a thread has panicked.
panic_payload: Arc<Mutex<Option<Box<dyn Any + Send>>>>, panic_payload: Arc<Mutex<Option<Box<dyn Any + Send>>>>,
/// When set, stops the executor from running any more systems. /// When set, stops the executor from running any more systems.
@ -127,8 +125,8 @@ impl SystemExecutor for MultiThreadedExecutor {
ExecutorKind::MultiThreaded ExecutorKind::MultiThreaded
} }
fn set_apply_final_buffers(&mut self, value: bool) { fn set_apply_final_deferred(&mut self, value: bool) {
self.apply_final_buffers = value; self.apply_final_deferred = value;
} }
fn init(&mut self, schedule: &SystemSchedule) { fn init(&mut self, schedule: &SystemSchedule) {
@ -230,10 +228,10 @@ impl SystemExecutor for MultiThreadedExecutor {
}, },
); );
if self.apply_final_buffers { if self.apply_final_deferred {
// Do one final apply buffers after all systems have completed // Do one final apply buffers after all systems have completed
// Commands should be applied while on the scope's thread, not the executor's thread // Commands should be applied while on the scope's thread, not the executor's thread
let res = apply_system_buffers(&self.unapplied_systems, systems, world); let res = apply_deferred(&self.unapplied_systems, systems, world);
if let Err(payload) = res { if let Err(payload) = res {
let mut panic_payload = self.panic_payload.lock().unwrap(); let mut panic_payload = self.panic_payload.lock().unwrap();
*panic_payload = Some(payload); *panic_payload = Some(payload);
@ -278,7 +276,7 @@ impl MultiThreadedExecutor {
skipped_systems: FixedBitSet::new(), skipped_systems: FixedBitSet::new(),
completed_systems: FixedBitSet::new(), completed_systems: FixedBitSet::new(),
unapplied_systems: FixedBitSet::new(), unapplied_systems: FixedBitSet::new(),
apply_final_buffers: true, apply_final_deferred: true,
panic_payload: Arc::new(Mutex::new(None)), panic_payload: Arc::new(Mutex::new(None)),
stop_spawning: false, stop_spawning: false,
} }
@ -556,14 +554,14 @@ impl MultiThreadedExecutor {
let sender = self.sender.clone(); let sender = self.sender.clone();
let panic_payload = self.panic_payload.clone(); let panic_payload = self.panic_payload.clone();
if is_apply_system_buffers(system) { if is_apply_deferred(system) {
// TODO: avoid allocation // TODO: avoid allocation
let unapplied_systems = self.unapplied_systems.clone(); let unapplied_systems = self.unapplied_systems.clone();
self.unapplied_systems.clear(); self.unapplied_systems.clear();
let task = async move { let task = async move {
#[cfg(feature = "trace")] #[cfg(feature = "trace")]
let system_guard = system_span.enter(); let system_guard = system_span.enter();
let res = apply_system_buffers(&unapplied_systems, systems, world); let res = apply_deferred(&unapplied_systems, systems, world);
#[cfg(feature = "trace")] #[cfg(feature = "trace")]
drop(system_guard); drop(system_guard);
// tell the executor that the system finished // tell the executor that the system finished
@ -681,7 +679,7 @@ impl MultiThreadedExecutor {
} }
} }
fn apply_system_buffers( fn apply_deferred(
unapplied_systems: &FixedBitSet, unapplied_systems: &FixedBitSet,
systems: &[SyncUnsafeCell<BoxedSystem>], systems: &[SyncUnsafeCell<BoxedSystem>],
world: &mut World, world: &mut World,
@ -690,7 +688,7 @@ fn apply_system_buffers(
// SAFETY: none of these systems are running, no other references exist // SAFETY: none of these systems are running, no other references exist
let system = unsafe { &mut *systems[system_index].get() }; let system = unsafe { &mut *systems[system_index].get() };
let res = std::panic::catch_unwind(AssertUnwindSafe(|| { let res = std::panic::catch_unwind(AssertUnwindSafe(|| {
system.apply_buffers(world); system.apply_deferred(world);
})); }));
if let Err(payload) = res { if let Err(payload) = res {
eprintln!( eprintln!(

View file

@ -9,7 +9,7 @@ use crate::{
}; };
/// A variant of [`SingleThreadedExecutor`](crate::schedule::SingleThreadedExecutor) that calls /// A variant of [`SingleThreadedExecutor`](crate::schedule::SingleThreadedExecutor) that calls
/// [`apply_buffers`](crate::system::System::apply_buffers) immediately after running each system. /// [`apply_deferred`](crate::system::System::apply_deferred) immediately after running each system.
#[derive(Default)] #[derive(Default)]
pub struct SimpleExecutor { pub struct SimpleExecutor {
/// Systems sets whose conditions have been evaluated. /// Systems sets whose conditions have been evaluated.
@ -23,7 +23,7 @@ impl SystemExecutor for SimpleExecutor {
ExecutorKind::Simple ExecutorKind::Simple
} }
fn set_apply_final_buffers(&mut self, _: bool) { fn set_apply_final_deferred(&mut self, _: bool) {
// do nothing. simple executor does not do a final sync // do nothing. simple executor does not do a final sync
} }
@ -89,7 +89,7 @@ impl SystemExecutor for SimpleExecutor {
std::panic::resume_unwind(payload); std::panic::resume_unwind(payload);
} }
system.apply_buffers(world); system.apply_deferred(world);
} }
self.evaluated_sets.clear(); self.evaluated_sets.clear();

View file

@ -4,9 +4,7 @@ use fixedbitset::FixedBitSet;
use std::panic::AssertUnwindSafe; use std::panic::AssertUnwindSafe;
use crate::{ use crate::{
schedule::{ schedule::{is_apply_deferred, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule},
is_apply_system_buffers, BoxedCondition, ExecutorKind, SystemExecutor, SystemSchedule,
},
world::World, world::World,
}; };
@ -22,8 +20,8 @@ pub struct SingleThreadedExecutor {
completed_systems: FixedBitSet, completed_systems: FixedBitSet,
/// Systems that have run but have not had their buffers applied. /// Systems that have run but have not had their buffers applied.
unapplied_systems: FixedBitSet, unapplied_systems: FixedBitSet,
/// Setting when true applies system buffers after all systems have run /// Setting when true applies deferred system buffers after all systems have run
apply_final_buffers: bool, apply_final_deferred: bool,
} }
impl SystemExecutor for SingleThreadedExecutor { impl SystemExecutor for SingleThreadedExecutor {
@ -31,8 +29,8 @@ impl SystemExecutor for SingleThreadedExecutor {
ExecutorKind::SingleThreaded ExecutorKind::SingleThreaded
} }
fn set_apply_final_buffers(&mut self, apply_final_buffers: bool) { fn set_apply_final_deferred(&mut self, apply_final_deferred: bool) {
self.apply_final_buffers = apply_final_buffers; self.apply_final_deferred = apply_final_deferred;
} }
fn init(&mut self, schedule: &SystemSchedule) { fn init(&mut self, schedule: &SystemSchedule) {
@ -87,10 +85,10 @@ impl SystemExecutor for SingleThreadedExecutor {
} }
let system = &mut schedule.systems[system_index]; let system = &mut schedule.systems[system_index];
if is_apply_system_buffers(system) { if is_apply_deferred(system) {
#[cfg(feature = "trace")] #[cfg(feature = "trace")]
let system_span = info_span!("system", name = &*name).entered(); let system_span = info_span!("system", name = &*name).entered();
self.apply_system_buffers(schedule, world); self.apply_deferred(schedule, world);
#[cfg(feature = "trace")] #[cfg(feature = "trace")]
system_span.exit(); system_span.exit();
} else { } else {
@ -109,8 +107,8 @@ impl SystemExecutor for SingleThreadedExecutor {
} }
} }
if self.apply_final_buffers { if self.apply_final_deferred {
self.apply_system_buffers(schedule, world); self.apply_deferred(schedule, world);
} }
self.evaluated_sets.clear(); self.evaluated_sets.clear();
self.completed_systems.clear(); self.completed_systems.clear();
@ -123,14 +121,14 @@ impl SingleThreadedExecutor {
evaluated_sets: FixedBitSet::new(), evaluated_sets: FixedBitSet::new(),
completed_systems: FixedBitSet::new(), completed_systems: FixedBitSet::new(),
unapplied_systems: FixedBitSet::new(), unapplied_systems: FixedBitSet::new(),
apply_final_buffers: true, apply_final_deferred: true,
} }
} }
fn apply_system_buffers(&mut self, schedule: &mut SystemSchedule, world: &mut World) { fn apply_deferred(&mut self, schedule: &mut SystemSchedule, world: &mut World) {
for system_index in self.unapplied_systems.ones() { for system_index in self.unapplied_systems.ones() {
let system = &mut schedule.systems[system_index]; let system = &mut schedule.systems[system_index];
system.apply_buffers(world); system.apply_deferred(world);
} }
self.unapplied_systems.clear(); self.unapplied_systems.clear();

View file

@ -219,12 +219,12 @@ impl Schedule {
self self
} }
/// Set whether the schedule applies buffers on final time or not. This is a catchall /// Set whether the schedule applies deferred system buffers on final time or not. This is a catch-all
/// incase a system uses commands but was not explicitly ordered after a /// in case a system uses commands but was not explicitly ordered before an instance of
/// [`apply_system_buffers`](crate::prelude::apply_system_buffers). By default this /// [`apply_deferred`](crate::prelude::apply_deferred). By default this
/// setting is true, but may be disabled if needed. /// setting is true, but may be disabled if needed.
pub fn set_apply_final_buffers(&mut self, apply_final_buffers: bool) -> &mut Self { pub fn set_apply_final_deferred(&mut self, apply_final_deferred: bool) -> &mut Self {
self.executor.set_apply_final_buffers(apply_final_buffers); self.executor.set_apply_final_deferred(apply_final_deferred);
self self
} }
@ -287,17 +287,17 @@ impl Schedule {
} }
} }
/// Directly applies any accumulated system buffers (like [`Commands`](crate::prelude::Commands)) to the `world`. /// Directly applies any accumulated [`Deferred`](crate::system::Deferred) system parameters (like [`Commands`](crate::prelude::Commands)) to the `world`.
/// ///
/// Like always, system buffers are applied in the "topological sort order" of the schedule graph. /// Like always, deferred system parameters are applied in the "topological sort order" of the schedule graph.
/// As a result, buffers from one system are only guaranteed to be applied before those of other systems /// As a result, buffers from one system are only guaranteed to be applied before those of other systems
/// if there is an explicit system ordering between the two systems. /// if there is an explicit system ordering between the two systems.
/// ///
/// This is used in rendering to extract data from the main world, storing the data in system buffers, /// This is used in rendering to extract data from the main world, storing the data in system buffers,
/// before applying their buffers in a different world. /// before applying their buffers in a different world.
pub fn apply_system_buffers(&mut self, world: &mut World) { pub fn apply_deferred(&mut self, world: &mut World) {
for system in &mut self.executable.systems { for system in &mut self.executable.systems {
system.apply_buffers(world); system.apply_deferred(world);
} }
} }
} }

View file

@ -187,9 +187,9 @@ where
) )
} }
fn apply_buffers(&mut self, world: &mut World) { fn apply_deferred(&mut self, world: &mut World) {
self.a.apply_buffers(world); self.a.apply_deferred(world);
self.b.apply_buffers(world); self.b.apply_deferred(world);
} }
fn initialize(&mut self, world: &mut World) { fn initialize(&mut self, world: &mut World) {

View file

@ -50,11 +50,11 @@ pub trait Command: Send + 'static {
/// ///
/// Since each command requires exclusive access to the `World`, /// Since each command requires exclusive access to the `World`,
/// all queued commands are automatically applied in sequence /// all queued commands are automatically applied in sequence
/// when the [`apply_system_buffers`] system runs. /// when the [`apply_deferred`] system runs.
/// ///
/// The command queue of an individual system can also be manually applied /// The command queue of an individual system can also be manually applied
/// by calling [`System::apply_buffers`]. /// by calling [`System::apply_deferred`].
/// Similarly, the command queue of a schedule can be manually applied via [`Schedule::apply_system_buffers`]. /// Similarly, the command queue of a schedule can be manually applied via [`Schedule::apply_deferred`].
/// ///
/// Each command can be used to modify the [`World`] in arbitrary ways: /// Each command can be used to modify the [`World`] in arbitrary ways:
/// * spawning or despawning entities /// * spawning or despawning entities
@ -68,7 +68,7 @@ pub trait Command: Send + 'static {
/// ///
/// # Usage /// # Usage
/// ///
/// Add `mut commands: Commands` as a function argument to your system to get a copy of this struct that will be applied the next time a copy of [`apply_system_buffers`] runs. /// Add `mut commands: Commands` as a function argument to your system to get a copy of this struct that will be applied the next time a copy of [`apply_deferred`] runs.
/// Commands are almost always used as a [`SystemParam`](crate::system::SystemParam). /// Commands are almost always used as a [`SystemParam`](crate::system::SystemParam).
/// ///
/// ``` /// ```
@ -100,9 +100,9 @@ pub trait Command: Send + 'static {
/// # } /// # }
/// ``` /// ```
/// ///
/// [`System::apply_buffers`]: crate::system::System::apply_buffers /// [`System::apply_deferred`]: crate::system::System::apply_deferred
/// [`apply_system_buffers`]: crate::schedule::apply_system_buffers /// [`apply_deferred`]: crate::schedule::apply_deferred
/// [`Schedule::apply_system_buffers`]: crate::schedule::Schedule::apply_system_buffers /// [`Schedule::apply_deferred`]: crate::schedule::Schedule::apply_deferred
#[derive(SystemParam)] #[derive(SystemParam)]
pub struct Commands<'w, 's> { pub struct Commands<'w, 's> {
queue: Deferred<'s, CommandQueue>, queue: Deferred<'s, CommandQueue>,

View file

@ -122,7 +122,7 @@ where
} }
#[inline] #[inline]
fn apply_buffers(&mut self, _world: &mut World) { fn apply_deferred(&mut self, _world: &mut World) {
// "pure" exclusive systems do not have any buffers to apply. // "pure" exclusive systems do not have any buffers to apply.
// Systems made by piping a normal system with an exclusive system // Systems made by piping a normal system with an exclusive system
// might have buffers to apply, but this is handled by `PipeSystem`. // might have buffers to apply, but this is handled by `PipeSystem`.

View file

@ -445,7 +445,7 @@ where
} }
#[inline] #[inline]
fn apply_buffers(&mut self, world: &mut World) { fn apply_deferred(&mut self, world: &mut World) {
let param_state = self.param_state.as_mut().expect(Self::PARAM_MESSAGE); let param_state = self.param_state.as_mut().expect(Self::PARAM_MESSAGE);
F::Param::apply(param_state, &self.system_meta, world); F::Param::apply(param_state, &self.system_meta, world);
} }

View file

@ -491,7 +491,7 @@ mod tests {
prelude::AnyOf, prelude::AnyOf,
query::{Added, Changed, Or, With, Without}, query::{Added, Changed, Or, With, Without},
removal_detection::RemovedComponents, removal_detection::RemovedComponents,
schedule::{apply_system_buffers, IntoSystemConfigs, Schedule}, schedule::{apply_deferred, IntoSystemConfigs, Schedule},
system::{ system::{
adapter::new, Commands, In, IntoSystem, Local, NonSend, NonSendMut, ParamSet, Query, adapter::new, Commands, In, IntoSystem, Local, NonSend, NonSendMut, ParamSet, Query,
QueryComponentError, Res, ResMut, Resource, System, SystemState, QueryComponentError, Res, ResMut, Resource, System, SystemState,
@ -717,7 +717,7 @@ mod tests {
let mut schedule = Schedule::default(); let mut schedule = Schedule::default();
schedule.add_systems((incr_e_on_flip, apply_system_buffers, World::clear_trackers).chain()); schedule.add_systems((incr_e_on_flip, apply_deferred, World::clear_trackers).chain());
schedule.run(&mut world); schedule.run(&mut world);
assert_eq!(world.resource::<Added>().0, 1); assert_eq!(world.resource::<Added>().0, 1);

View file

@ -61,7 +61,8 @@ pub trait System: Send + Sync + 'static {
// - `update_archetype_component_access` has been called. // - `update_archetype_component_access` has been called.
unsafe { self.run_unsafe(input, world) } unsafe { self.run_unsafe(input, world) }
} }
fn apply_buffers(&mut self, world: &mut World); /// Applies any [`Deferred`](crate::system::Deferred) system parameters (or other system buffers) of this system to the world.
fn apply_deferred(&mut self, world: &mut World);
/// Initialize the system. /// Initialize the system.
fn initialize(&mut self, _world: &mut World); fn initialize(&mut self, _world: &mut World);
/// Update the system's archetype component [`Access`]. /// Update the system's archetype component [`Access`].

View file

@ -118,7 +118,7 @@ pub unsafe trait SystemParam: Sized {
} }
/// Applies any deferred mutations stored in this [`SystemParam`]'s state. /// Applies any deferred mutations stored in this [`SystemParam`]'s state.
/// This is used to apply [`Commands`] during [`apply_system_buffers`](crate::prelude::apply_system_buffers). /// This is used to apply [`Commands`] during [`apply_deferred`](crate::prelude::apply_deferred).
/// ///
/// [`Commands`]: crate::prelude::Commands /// [`Commands`]: crate::prelude::Commands
#[inline] #[inline]
@ -766,7 +766,7 @@ pub trait SystemBuffer: FromWorld + Send + 'static {
} }
/// A [`SystemParam`] that stores a buffer which gets applied to the [`World`] during /// A [`SystemParam`] that stores a buffer which gets applied to the [`World`] during
/// [`apply_system_buffers`](crate::schedule::apply_system_buffers). /// [`apply_deferred`](crate::schedule::apply_deferred).
/// This is used internally by [`Commands`] to defer `World` mutations. /// This is used internally by [`Commands`] to defer `World` mutations.
/// ///
/// [`Commands`]: crate::system::Commands /// [`Commands`]: crate::system::Commands
@ -809,7 +809,7 @@ pub trait SystemBuffer: FromWorld + Send + 'static {
/// struct AlarmFlag(bool); /// struct AlarmFlag(bool);
/// ///
/// impl AlarmFlag { /// impl AlarmFlag {
/// /// Sounds the alarm the next time buffers are applied via apply_system_buffers. /// /// Sounds the alarm the next time buffers are applied via apply_deferred.
/// pub fn flag(&mut self) { /// pub fn flag(&mut self) {
/// self.0 = true; /// self.0 = true;
/// } /// }
@ -817,7 +817,7 @@ pub trait SystemBuffer: FromWorld + Send + 'static {
/// ///
/// impl SystemBuffer for AlarmFlag { /// impl SystemBuffer for AlarmFlag {
/// // When `AlarmFlag` is used in a system, this function will get /// // When `AlarmFlag` is used in a system, this function will get
/// // called the next time buffers are applied via apply_system_buffers. /// // called the next time buffers are applied via apply_deferred.
/// fn apply(&mut self, system_meta: &SystemMeta, world: &mut World) { /// fn apply(&mut self, system_meta: &SystemMeta, world: &mut World) {
/// if self.0 { /// if self.0 {
/// world.resource_mut::<Alarm>().0 = true; /// world.resource_mut::<Alarm>().0 = true;

View file

@ -202,7 +202,7 @@ impl Plugin for PbrPlugin {
PostUpdate, PostUpdate,
( (
add_clusters.in_set(SimulationLightSystems::AddClusters), add_clusters.in_set(SimulationLightSystems::AddClusters),
apply_system_buffers.in_set(SimulationLightSystems::AddClustersFlush), apply_deferred.in_set(SimulationLightSystems::AddClustersFlush),
assign_lights_to_clusters assign_lights_to_clusters
.in_set(SimulationLightSystems::AssignLightsToClusters) .in_set(SimulationLightSystems::AssignLightsToClusters)
.after(TransformSystem::TransformPropagate) .after(TransformSystem::TransformPropagate)
@ -283,7 +283,7 @@ impl Plugin for PbrPlugin {
.in_set(RenderLightSystems::PrepareLights), .in_set(RenderLightSystems::PrepareLights),
// A sync is needed after prepare_lights, before prepare_view_uniforms, // A sync is needed after prepare_lights, before prepare_view_uniforms,
// because prepare_lights creates new views for shadow mapping // because prepare_lights creates new views for shadow mapping
apply_system_buffers apply_deferred
.in_set(RenderSet::Prepare) .in_set(RenderSet::Prepare)
.after(RenderLightSystems::PrepareLights) .after(RenderLightSystems::PrepareLights)
.before(ViewSet::PrepareUniforms), .before(ViewSet::PrepareUniforms),

View file

@ -165,7 +165,7 @@ where
prepare_previous_view_projection_uniforms prepare_previous_view_projection_uniforms
.in_set(RenderSet::Prepare) .in_set(RenderSet::Prepare)
.after(PrepassLightsViewFlush), .after(PrepassLightsViewFlush),
apply_system_buffers apply_deferred
.in_set(RenderSet::Prepare) .in_set(RenderSet::Prepare)
.in_set(PrepassLightsViewFlush) .in_set(PrepassLightsViewFlush)
.after(prepare_lights), .after(prepare_lights),

View file

@ -72,39 +72,39 @@ pub struct RenderPlugin {
/// The labels of the default App rendering sets. /// The labels of the default App rendering sets.
/// ///
/// The sets run in the order listed, with [`apply_system_buffers`] inserted between each set. /// The sets run in the order listed, with [`apply_deferred`] inserted between each set.
/// ///
/// The `*Flush` sets are assigned to the copy of [`apply_system_buffers`] /// The `*Flush` sets are assigned to the copy of [`apply_deferred`]
/// that runs immediately after the matching system set. /// that runs immediately after the matching system set.
/// These can be useful for ordering, but you almost never want to add your systems to these sets. /// These can be useful for ordering, but you almost never want to add your systems to these sets.
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)] #[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)]
pub enum RenderSet { pub enum RenderSet {
/// The copy of [`apply_system_buffers`] that runs at the beginning of this schedule. /// The copy of [`apply_deferred`] that runs at the beginning of this schedule.
/// This is used for applying the commands from the [`ExtractSchedule`] /// This is used for applying the commands from the [`ExtractSchedule`]
ExtractCommands, ExtractCommands,
/// Prepare render resources from the extracted data for the GPU. /// Prepare render resources from the extracted data for the GPU.
Prepare, Prepare,
/// The copy of [`apply_system_buffers`] that runs immediately after [`Prepare`](RenderSet::Prepare). /// The copy of [`apply_deferred`] that runs immediately after [`Prepare`](RenderSet::Prepare).
PrepareFlush, PrepareFlush,
/// Create [`BindGroups`](render_resource::BindGroup) that depend on /// Create [`BindGroups`](render_resource::BindGroup) that depend on
/// [`Prepare`](RenderSet::Prepare) data and queue up draw calls to run during the /// [`Prepare`](RenderSet::Prepare) data and queue up draw calls to run during the
/// [`Render`](RenderSet::Render) step. /// [`Render`](RenderSet::Render) step.
Queue, Queue,
/// The copy of [`apply_system_buffers`] that runs immediately after [`Queue`](RenderSet::Queue). /// The copy of [`apply_deferred`] that runs immediately after [`Queue`](RenderSet::Queue).
QueueFlush, QueueFlush,
// TODO: This could probably be moved in favor of a system ordering abstraction in Render or Queue // TODO: This could probably be moved in favor of a system ordering abstraction in Render or Queue
/// Sort the [`RenderPhases`](render_phase::RenderPhase) here. /// Sort the [`RenderPhases`](render_phase::RenderPhase) here.
PhaseSort, PhaseSort,
/// The copy of [`apply_system_buffers`] that runs immediately after [`PhaseSort`](RenderSet::PhaseSort). /// The copy of [`apply_deferred`] that runs immediately after [`PhaseSort`](RenderSet::PhaseSort).
PhaseSortFlush, PhaseSortFlush,
/// Actual rendering happens here. /// Actual rendering happens here.
/// In most cases, only the render backend should insert resources here. /// In most cases, only the render backend should insert resources here.
Render, Render,
/// The copy of [`apply_system_buffers`] that runs immediately after [`Render`](RenderSet::Render). /// The copy of [`apply_deferred`] that runs immediately after [`Render`](RenderSet::Render).
RenderFlush, RenderFlush,
/// Cleanup render resources here. /// Cleanup render resources here.
Cleanup, Cleanup,
/// The copy of [`apply_system_buffers`] that runs immediately after [`Cleanup`](RenderSet::Cleanup). /// The copy of [`apply_deferred`] that runs immediately after [`Cleanup`](RenderSet::Cleanup).
CleanupFlush, CleanupFlush,
} }
@ -116,7 +116,7 @@ impl Render {
/// Sets up the base structure of the rendering [`Schedule`]. /// Sets up the base structure of the rendering [`Schedule`].
/// ///
/// The sets defined in this enum are configured to run in order, /// The sets defined in this enum are configured to run in order,
/// and a copy of [`apply_system_buffers`] is inserted into each `*Flush` set. /// and a copy of [`apply_deferred`] is inserted into each `*Flush` set.
pub fn base_schedule() -> Schedule { pub fn base_schedule() -> Schedule {
use RenderSet::*; use RenderSet::*;
@ -124,11 +124,11 @@ impl Render {
// Create "stage-like" structure using buffer flushes + ordering // Create "stage-like" structure using buffer flushes + ordering
schedule.add_systems(( schedule.add_systems((
apply_system_buffers.in_set(PrepareFlush), apply_deferred.in_set(PrepareFlush),
apply_system_buffers.in_set(QueueFlush), apply_deferred.in_set(QueueFlush),
apply_system_buffers.in_set(PhaseSortFlush), apply_deferred.in_set(PhaseSortFlush),
apply_system_buffers.in_set(RenderFlush), apply_deferred.in_set(RenderFlush),
apply_system_buffers.in_set(CleanupFlush), apply_deferred.in_set(CleanupFlush),
)); ));
schedule.configure_sets( schedule.configure_sets(
@ -158,7 +158,7 @@ impl Render {
/// running the next frame while rendering the current frame. /// running the next frame while rendering the current frame.
/// ///
/// This schedule is run on the main world, but its buffers are not applied /// This schedule is run on the main world, but its buffers are not applied
/// via [`Schedule::apply_system_buffers`](bevy_ecs::schedule::Schedule) until it is returned to the render world. /// via [`Schedule::apply_deferred`](bevy_ecs::schedule::Schedule) until it is returned to the render world.
#[derive(ScheduleLabel, PartialEq, Eq, Debug, Clone, Hash)] #[derive(ScheduleLabel, PartialEq, Eq, Debug, Clone, Hash)]
pub struct ExtractSchedule; pub struct ExtractSchedule;
@ -269,7 +269,7 @@ impl Plugin for RenderPlugin {
render_app.main_schedule_label = Box::new(Render); render_app.main_schedule_label = Box::new(Render);
let mut extract_schedule = Schedule::new(); let mut extract_schedule = Schedule::new();
extract_schedule.set_apply_final_buffers(false); extract_schedule.set_apply_final_deferred(false);
render_app render_app
.add_schedule(ExtractSchedule, extract_schedule) .add_schedule(ExtractSchedule, extract_schedule)
@ -404,6 +404,6 @@ fn apply_extract_commands(render_world: &mut World) {
schedules schedules
.get_mut(&ExtractSchedule) .get_mut(&ExtractSchedule)
.unwrap() .unwrap()
.apply_system_buffers(render_world); .apply_deferred(render_world);
}); });
} }

View file

@ -214,10 +214,7 @@ impl Plugin for VisibilityPlugin {
app app
// We add an AABB component in CalculateBounds, which must be ready on the same frame. // We add an AABB component in CalculateBounds, which must be ready on the same frame.
.add_systems( .add_systems(PostUpdate, apply_deferred.in_set(CalculateBoundsFlush))
PostUpdate,
apply_system_buffers.in_set(CalculateBoundsFlush),
)
.configure_set(PostUpdate, CalculateBoundsFlush.after(CalculateBounds)) .configure_set(PostUpdate, CalculateBoundsFlush.after(CalculateBounds))
.add_systems( .add_systems(
PostUpdate, PostUpdate,

View file

@ -74,7 +74,7 @@ pub trait BuildChildrenTransformExt {
/// ///
/// Note that both the hierarchy and transform updates will only execute /// Note that both the hierarchy and transform updates will only execute
/// the next time commands are applied /// the next time commands are applied
/// (during [`apply_system_buffers`](bevy_ecs::schedule::apply_system_buffers)). /// (during [`apply_deferred`](bevy_ecs::schedule::apply_deferred)).
fn set_parent_in_place(&mut self, parent: Entity) -> &mut Self; fn set_parent_in_place(&mut self, parent: Entity) -> &mut Self;
/// Make this entity parentless while preserving this entity's [`GlobalTransform`] /// Make this entity parentless while preserving this entity's [`GlobalTransform`]
@ -85,7 +85,7 @@ pub trait BuildChildrenTransformExt {
/// ///
/// Note that both the hierarchy and transform updates will only execute /// Note that both the hierarchy and transform updates will only execute
/// the next time commands are applied /// the next time commands are applied
/// (during [`apply_system_buffers`](bevy_ecs::schedule::apply_system_buffers)). /// (during [`apply_deferred`](bevy_ecs::schedule::apply_deferred)).
fn remove_parent_in_place(&mut self) -> &mut Self; fn remove_parent_in_place(&mut self) -> &mut Self;
} }
impl<'w, 's, 'a> BuildChildrenTransformExt for EntityCommands<'w, 's, 'a> { impl<'w, 's, 'a> BuildChildrenTransformExt for EntityCommands<'w, 's, 'a> {

View file

@ -206,7 +206,7 @@ Example | Description
Example | Description Example | Description
--- | --- --- | ---
[Apply System Buffers](../examples/ecs/apply_system_buffers.rs) | Show how to use `apply_system_buffers` system [Apply System Buffers](../examples/ecs/apply_deferred.rs) | Show how to use `apply_deferred` system
[Component Change Detection](../examples/ecs/component_change_detection.rs) | Change detection on components [Component Change Detection](../examples/ecs/component_change_detection.rs) | Change detection on components
[Custom Query Parameters](../examples/ecs/custom_query_param.rs) | Groups commonly used compound queries and query filters into a single type [Custom Query Parameters](../examples/ecs/custom_query_param.rs) | Groups commonly used compound queries and query filters into a single type
[ECS Guide](../examples/ecs/ecs_guide.rs) | Full guide to Bevy's ECS [ECS Guide](../examples/ecs/ecs_guide.rs) | Full guide to Bevy's ECS

View file

@ -1,4 +1,4 @@
//! This example illustrates how to use the `apply_system_buffers` system //! This example illustrates how to use the `apply_deferred` system
//! to flush commands added by systems that have already run, //! to flush commands added by systems that have already run,
//! but have not had their buffers applied yet. //! but have not had their buffers applied yet.
//! //!
@ -7,7 +7,7 @@
//! added to `CoreSet::Update`) but want to flush commands immediately. //! added to `CoreSet::Update`) but want to flush commands immediately.
//! //!
//! It is important that systems are ordered correctly with respect to //! It is important that systems are ordered correctly with respect to
//! `apply_system_buffers`, to avoid surprising non-deterministic system execution order. //! `apply_deferred`, to avoid surprising non-deterministic system execution order.
use bevy::prelude::*; use bevy::prelude::*;
@ -21,9 +21,9 @@ fn main() {
( (
( (
despawn_old_and_spawn_new_fruits, despawn_old_and_spawn_new_fruits,
// We encourage adding apply_system_buffers to a custom set // We encourage adding apply_deferred to a custom set
// to improve diagnostics. This is optional, but useful when debugging! // to improve diagnostics. This is optional, but useful when debugging!
apply_system_buffers.in_set(CustomFlush), apply_deferred.in_set(CustomFlush),
count_apple, count_apple,
) )
.chain(), .chain(),

View file

@ -7,7 +7,7 @@ fn main() {
// to react to the removal before the frame is over. // to react to the removal before the frame is over.
// //
// Also, `Components` are removed via a `Command`, which are not applied immediately. // Also, `Components` are removed via a `Command`, which are not applied immediately.
// So you need to react to the removal at some stage after `apply_system_buffers` has run, // So you need to react to the removal at some stage after `apply_deferred` has run,
// and the Component` is removed. // and the Component` is removed.
// //
// With these constraints in mind we make sure to place the system that removes a `Component` in // With these constraints in mind we make sure to place the system that removes a `Component` in