bevy_render::sync_world

Struct SyncWorldPlugin

Source
pub struct SyncWorldPlugin;
Expand description

A plugin that synchronizes entities with SyncToRenderWorld between the main world and the render world.

All entities with the SyncToRenderWorld component are kept in sync. It is automatically added as a required component by ExtractComponentPlugin and SyncComponentPlugin, so it doesn’t need to be added manually when spawning or as a required component when either of these plugins are used.

§Implementation

Bevy’s renderer is architected independently from the main app. It operates in its own separate ECS World, so the renderer logic can run in parallel with the main world logic. This is called “Pipelined Rendering”, see PipelinedRenderingPlugin for more information.

SyncWorldPlugin is the first thing that runs every frame and it maintains an entity-to-entity mapping between the main world and the render world. It does so by spawning and despawning entities in the render world, to match spawned and despawned entities in the main world. The link between synced entities is maintained by the RenderEntity and MainEntity components.

The RenderEntity contains the corresponding render world entity of a main world entity, while MainEntity contains the corresponding main world entity of a render world entity. For convenience, QueryData implementations are provided for both components: adding MainEntity to a query (without a &) will return the corresponding main world Entity, and adding RenderEntity will return the corresponding render world Entity. If you have access to the component itself, the underlying entities can be accessed by calling .id().

Synchronization is necessary preparation for extraction (ExtractSchedule), which copies over component data from the main to the render world for these entities.

|--------------------------------------------------------------------|
|      |         |          Main world update                        |
| sync | extract |---------------------------------------------------|
|      |         |         Render world update                       |
|--------------------------------------------------------------------|

An example for synchronized main entities 1v1 and 18v1

|---------------------------Main World------------------------------|
|  Entity  |                    Component                           |
|-------------------------------------------------------------------|
| ID: 1v1  | PointLight | RenderEntity(ID: 3V1) | SyncToRenderWorld |
| ID: 18v1 | PointLight | RenderEntity(ID: 5V1) | SyncToRenderWorld |
|-------------------------------------------------------------------|

|----------Render World-----------|
|  Entity  |       Component      |
|---------------------------------|
| ID: 3v1  | MainEntity(ID: 1V1)  |
| ID: 5v1  | MainEntity(ID: 18V1) |
|---------------------------------|

Note that this effectively establishes a link between the main world entity and the render world entity. Not every entity needs to be synchronized, however; only entities with the SyncToRenderWorld component are synced. Adding SyncToRenderWorld to a main world component will establish such a link. Once a synchronized main entity is despawned, its corresponding render entity will be automatically despawned in the next sync.

The sync step does not copy any of component data between worlds, since its often not necessary to transfer over all the components of a main world entity. The render world probably cares about a Position component, but not a Velocity component. The extraction happens in its own step, independently from, and after synchronization.

Moreover, SyncWorldPlugin only synchronizes entities. RenderAssets like meshes and textures are handled differently.

Trait Implementations§

Source§

impl Default for SyncWorldPlugin

Source§

fn default() -> SyncWorldPlugin

Returns the “default value” for a type. Read more
Source§

impl Plugin for SyncWorldPlugin

Source§

fn build(&self, app: &mut App)

Configures the App to which this plugin is added.
Source§

fn ready(&self, _app: &App) -> bool

Has the plugin finished its setup? This can be useful for plugins that need something asynchronous to happen before they can finish their setup, like the initialization of a renderer. Once the plugin is ready, finish should be called.
Source§

fn finish(&self, _app: &mut App)

Finish adding this plugin to the App, once all plugins registered are ready. This can be useful for plugins that depends on another plugin asynchronous setup, like the renderer.
Source§

fn cleanup(&self, _app: &mut App)

Runs after all plugins are built and finished, but before the app schedule is executed. This can be useful if you have some resource that other plugins need during their build step, but after build you want to remove it and send it to another thread.
Source§

fn name(&self) -> &str

Configures a name for the Plugin which is primarily used for checking plugin uniqueness and debugging.
Source§

fn is_unique(&self) -> bool

If the plugin can be meaningfully instantiated several times in an App, override this method to return false.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Downcast<T> for T

Source§

fn downcast(&self) -> &T

Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
Source§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &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)

Convert &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> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Sync + Send>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromWorld for T
where T: Default,

Source§

fn from_world(_world: &mut World) -> T

Creates Self using default().

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> Upcast<T> for T

Source§

fn upcast(&self) -> Option<&T>

Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<Marker, T> Plugins<Marker> for T
where T: Plugins<Marker>,

Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,