Converted exclusive systems to parallel systems wherever possible (#2774)

Closes #2767.

Converted:
- `play_queued_audio_system`
- `change_window`
This commit is contained in:
SarthakSingh31 2022-04-25 14:32:56 +00:00
parent 9b1651afa1
commit 5155034a58
8 changed files with 41 additions and 34 deletions

View File

@ -1,6 +1,6 @@
use crate::{Audio, AudioSource, Decodable}; use crate::{Audio, AudioSource, Decodable};
use bevy_asset::{Asset, Assets}; use bevy_asset::{Asset, Assets};
use bevy_ecs::world::World; use bevy_ecs::system::{NonSend, Res, ResMut};
use bevy_reflect::TypeUuid; use bevy_reflect::TypeUuid;
use bevy_utils::tracing::warn; use bevy_utils::tracing::warn;
use rodio::{OutputStream, OutputStreamHandle, Sink, Source}; use rodio::{OutputStream, OutputStreamHandle, Sink, Source};
@ -85,16 +85,13 @@ where
} }
/// Plays audio currently queued in the [`Audio`] resource through the [`AudioOutput`] resource /// Plays audio currently queued in the [`Audio`] resource through the [`AudioOutput`] resource
pub fn play_queued_audio_system<Source: Asset>(world: &mut World) pub fn play_queued_audio_system<Source: Asset + Decodable>(
where audio_output: NonSend<AudioOutput<Source>>,
Source: Decodable, audio_sources: Option<Res<Assets<Source>>>,
{ mut audio: ResMut<Audio<Source>>,
let world = world.cell(); mut sinks: ResMut<Assets<AudioSink>>,
let audio_output = world.get_non_send::<AudioOutput<Source>>().unwrap(); ) {
let mut audio = world.get_resource_mut::<Audio<Source>>().unwrap(); if let Some(audio_sources) = audio_sources {
let mut sinks = world.get_resource_mut::<Assets<AudioSink>>().unwrap();
if let Some(audio_sources) = world.get_resource::<Assets<Source>>() {
audio_output.try_play_queued(&*audio_sources, &mut *audio, &mut *sinks); audio_output.try_play_queued(&*audio_sources, &mut *audio, &mut *sinks);
}; };
} }

View File

@ -44,7 +44,6 @@ pub use audio_source::*;
use bevy_app::prelude::*; use bevy_app::prelude::*;
use bevy_asset::AddAsset; use bevy_asset::AddAsset;
use bevy_ecs::system::IntoExclusiveSystem;
/// Adds support for audio playback to a Bevy Application /// Adds support for audio playback to a Bevy Application
/// ///
@ -60,7 +59,7 @@ impl Plugin for AudioPlugin {
.init_resource::<Audio<AudioSource>>() .init_resource::<Audio<AudioSource>>()
.add_system_to_stage( .add_system_to_stage(
CoreStage::PostUpdate, CoreStage::PostUpdate,
play_queued_audio_system::<AudioSource>.exclusive_system(), play_queued_audio_system::<AudioSource>,
); );
#[cfg(any(feature = "mp3", feature = "flac", feature = "wav", feature = "vorbis"))] #[cfg(any(feature = "mp3", feature = "flac", feature = "wav", feature = "vorbis"))]

View File

@ -14,6 +14,8 @@ pub use material::*;
pub use pbr_material::*; pub use pbr_material::*;
pub use render::*; pub use render::*;
use bevy_window::ModifiesWindows;
pub mod prelude { pub mod prelude {
#[doc(hidden)] #[doc(hidden)]
pub use crate::{ pub use crate::{
@ -86,7 +88,8 @@ impl Plugin for PbrPlugin {
CoreStage::PostUpdate, CoreStage::PostUpdate,
assign_lights_to_clusters assign_lights_to_clusters
.label(SimulationLightSystems::AssignLightsToClusters) .label(SimulationLightSystems::AssignLightsToClusters)
.after(TransformSystem::TransformPropagate), .after(TransformSystem::TransformPropagate)
.after(ModifiesWindows),
) )
.add_system_to_stage( .add_system_to_stage(
CoreStage::PostUpdate, CoreStage::PostUpdate,

View File

@ -12,6 +12,8 @@ use crate::{
view::{ComputedVisibility, Visibility, VisibleEntities}, view::{ComputedVisibility, Visibility, VisibleEntities},
}; };
use bevy_app::{App, CoreStage, Plugin}; use bevy_app::{App, CoreStage, Plugin};
use bevy_ecs::schedule::ParallelSystemDescriptorCoercion;
use bevy_window::ModifiesWindows;
#[derive(Default)] #[derive(Default)]
pub struct CameraPlugin; pub struct CameraPlugin;
@ -32,11 +34,11 @@ impl Plugin for CameraPlugin {
.register_type::<Camera2d>() .register_type::<Camera2d>()
.add_system_to_stage( .add_system_to_stage(
CoreStage::PostUpdate, CoreStage::PostUpdate,
crate::camera::camera_system::<OrthographicProjection>, crate::camera::camera_system::<OrthographicProjection>.after(ModifiesWindows),
) )
.add_system_to_stage( .add_system_to_stage(
CoreStage::PostUpdate, CoreStage::PostUpdate,
crate::camera::camera_system::<PerspectiveProjection>, crate::camera::camera_system::<PerspectiveProjection>.after(ModifiesWindows),
) )
.add_plugin(CameraTypePlugin::<Camera3d>::default()) .add_plugin(CameraTypePlugin::<Camera3d>::default())
.add_plugin(CameraTypePlugin::<Camera2d>::default()); .add_plugin(CameraTypePlugin::<Camera2d>::default());

View File

@ -31,6 +31,7 @@ use bevy_asset::AddAsset;
use bevy_ecs::{entity::Entity, schedule::ParallelSystemDescriptorCoercion}; use bevy_ecs::{entity::Entity, schedule::ParallelSystemDescriptorCoercion};
use bevy_render::{RenderApp, RenderStage}; use bevy_render::{RenderApp, RenderStage};
use bevy_sprite::SpriteSystem; use bevy_sprite::SpriteSystem;
use bevy_window::ModifiesWindows;
pub type DefaultTextPipeline = TextPipeline<Entity>; pub type DefaultTextPipeline = TextPipeline<Entity>;
@ -46,7 +47,7 @@ impl Plugin for TextPlugin {
.register_type::<HorizontalAlign>() .register_type::<HorizontalAlign>()
.init_asset_loader::<FontLoader>() .init_asset_loader::<FontLoader>()
.insert_resource(DefaultTextPipeline::default()) .insert_resource(DefaultTextPipeline::default())
.add_system_to_stage(CoreStage::PostUpdate, text2d_system); .add_system_to_stage(CoreStage::PostUpdate, text2d_system.after(ModifiesWindows));
if let Ok(render_app) = app.get_sub_app_mut(RenderApp) { if let Ok(render_app) = app.get_sub_app_mut(RenderApp) {
render_app.add_system_to_stage( render_app.add_system_to_stage(

View File

@ -31,6 +31,7 @@ use bevy_ecs::schedule::{ParallelSystemDescriptorCoercion, SystemLabel};
use bevy_input::InputSystem; use bevy_input::InputSystem;
use bevy_math::Rect; use bevy_math::Rect;
use bevy_transform::TransformSystem; use bevy_transform::TransformSystem;
use bevy_window::ModifiesWindows;
use update::{ui_z_system, update_clipping_system}; use update::{ui_z_system, update_clipping_system};
use crate::prelude::CameraUi; use crate::prelude::CameraUi;
@ -84,7 +85,9 @@ impl Plugin for UiPlugin {
// add these stages to front because these must run before transform update systems // add these stages to front because these must run before transform update systems
.add_system_to_stage( .add_system_to_stage(
CoreStage::PostUpdate, CoreStage::PostUpdate,
widget::text_system.before(UiSystem::Flex), widget::text_system
.before(UiSystem::Flex)
.after(ModifiesWindows),
) )
.add_system_to_stage( .add_system_to_stage(
CoreStage::PostUpdate, CoreStage::PostUpdate,
@ -94,7 +97,8 @@ impl Plugin for UiPlugin {
CoreStage::PostUpdate, CoreStage::PostUpdate,
flex_node_system flex_node_system
.label(UiSystem::Flex) .label(UiSystem::Flex)
.before(TransformSystem::TransformPropagate), .before(TransformSystem::TransformPropagate)
.after(ModifiesWindows),
) )
.add_system_to_stage( .add_system_to_stage(
CoreStage::PostUpdate, CoreStage::PostUpdate,

View File

@ -21,7 +21,7 @@ pub mod prelude {
} }
use bevy_app::prelude::*; use bevy_app::prelude::*;
use bevy_ecs::event::Events; use bevy_ecs::{event::Events, schedule::SystemLabel};
pub struct WindowPlugin { pub struct WindowPlugin {
pub add_primary_window: bool, pub add_primary_window: bool,
@ -74,3 +74,6 @@ impl Plugin for WindowPlugin {
} }
} }
} }
#[derive(Debug, Hash, PartialEq, Eq, Clone, SystemLabel)]
pub struct ModifiesWindows;

View File

@ -12,8 +12,9 @@ pub use winit_windows::*;
use bevy_app::{App, AppExit, CoreStage, Plugin}; use bevy_app::{App, AppExit, CoreStage, Plugin};
use bevy_ecs::{ use bevy_ecs::{
event::{Events, ManualEventReader}, event::{EventWriter, Events, ManualEventReader},
system::IntoExclusiveSystem, schedule::ParallelSystemDescriptorCoercion,
system::{NonSend, ResMut},
world::World, world::World,
}; };
use bevy_math::{ivec2, DVec2, Vec2}; use bevy_math::{ivec2, DVec2, Vec2};
@ -22,9 +23,9 @@ use bevy_utils::{
Instant, Instant,
}; };
use bevy_window::{ use bevy_window::{
CreateWindow, CursorEntered, CursorLeft, CursorMoved, FileDragAndDrop, ReceivedCharacter, CreateWindow, CursorEntered, CursorLeft, CursorMoved, FileDragAndDrop, ModifiesWindows,
RequestRedraw, WindowBackendScaleFactorChanged, WindowCloseRequested, WindowCreated, ReceivedCharacter, RequestRedraw, WindowBackendScaleFactorChanged, WindowCloseRequested,
WindowFocused, WindowMoved, WindowResized, WindowScaleFactorChanged, Windows, WindowCreated, WindowFocused, WindowMoved, WindowResized, WindowScaleFactorChanged, Windows,
}; };
use winit::{ use winit::{
dpi::PhysicalPosition, dpi::PhysicalPosition,
@ -42,18 +43,18 @@ impl Plugin for WinitPlugin {
app.init_non_send_resource::<WinitWindows>() app.init_non_send_resource::<WinitWindows>()
.init_resource::<WinitSettings>() .init_resource::<WinitSettings>()
.set_runner(winit_runner) .set_runner(winit_runner)
.add_system_to_stage(CoreStage::PostUpdate, change_window.exclusive_system()); .add_system_to_stage(CoreStage::PostUpdate, change_window.label(ModifiesWindows));
let event_loop = EventLoop::new(); let event_loop = EventLoop::new();
handle_initial_window_events(&mut app.world, &event_loop); handle_initial_window_events(&mut app.world, &event_loop);
app.insert_non_send_resource(event_loop); app.insert_non_send_resource(event_loop);
} }
} }
fn change_window(world: &mut World) { fn change_window(
let world = world.cell(); winit_windows: NonSend<WinitWindows>,
let winit_windows = world.get_non_send::<WinitWindows>().unwrap(); mut windows: ResMut<Windows>,
let mut windows = world.get_resource_mut::<Windows>().unwrap(); mut window_dpi_changed_events: EventWriter<WindowScaleFactorChanged>,
) {
for bevy_window in windows.iter_mut() { for bevy_window in windows.iter_mut() {
let id = bevy_window.id(); let id = bevy_window.id();
for command in bevy_window.drain_commands() { for command in bevy_window.drain_commands() {
@ -88,9 +89,6 @@ fn change_window(world: &mut World) {
window.set_title(&title); window.set_title(&title);
} }
bevy_window::WindowCommand::SetScaleFactor { scale_factor } => { bevy_window::WindowCommand::SetScaleFactor { scale_factor } => {
let mut window_dpi_changed_events = world
.get_resource_mut::<Events<WindowScaleFactorChanged>>()
.unwrap();
window_dpi_changed_events.send(WindowScaleFactorChanged { id, scale_factor }); window_dpi_changed_events.send(WindowScaleFactorChanged { id, scale_factor });
} }
bevy_window::WindowCommand::SetResolution { bevy_window::WindowCommand::SetResolution {