From 3a9ad932e4557bef59d335144452b6196e639f25 Mon Sep 17 00:00:00 2001 From: Timothy Warren Date: Thu, 3 Feb 2022 10:17:02 -0500 Subject: [PATCH] Make system dispatching multi-threaded --- src/systems.rs | 22 ++++++------- src/systems/dispatcher.rs | 8 +++++ src/systems/dispatcher/multi_thread.rs | 44 +++++++++++++++++++++++++ src/systems/dispatcher/single_thread.rs | 1 - 4 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 src/systems/dispatcher/multi_thread.rs diff --git a/src/systems.rs b/src/systems.rs index cd86105..dc437d3 100644 --- a/src/systems.rs +++ b/src/systems.rs @@ -15,17 +15,17 @@ mod trigger_system; mod visibility_system; // System imports -pub use ai::*; -pub use hunger_system::HungerSystem; -pub use inventory_system::*; -pub use lighting_system::LightingSystem; -pub use map_indexing_system::MapIndexingSystem; -pub use melee_combat_system::MeleeCombatSystem; -pub use movement_system::MovementSystem; -pub use particle_system::ParticleSpawnSystem; -pub use ranged_combat_system::RangedCombatSystem; -pub use trigger_system::TriggerSystem; -pub use visibility_system::VisibilitySystem; +use ai::*; +use hunger_system::HungerSystem; +use inventory_system::*; +use lighting_system::LightingSystem; +use map_indexing_system::MapIndexingSystem; +use melee_combat_system::MeleeCombatSystem; +use movement_system::MovementSystem; +use particle_system::ParticleSpawnSystem; +use ranged_combat_system::RangedCombatSystem; +use trigger_system::TriggerSystem; +use visibility_system::VisibilitySystem; pub fn build() -> Box { dispatcher::new() diff --git a/src/systems/dispatcher.rs b/src/systems/dispatcher.rs index 1120a90..acbef55 100644 --- a/src/systems/dispatcher.rs +++ b/src/systems/dispatcher.rs @@ -1,7 +1,15 @@ +#[cfg(target_arch = "wasm32")] #[macro_use] mod single_thread; +#[cfg(not(target_arch = "wasm32"))] +#[macro_use] +mod multi_thread; + use ::specs::prelude::World; +#[cfg(not(target_arch = "wasm32"))] +pub use multi_thread::*; +#[cfg(target_arch = "wasm32")] pub use single_thread::*; use super::*; diff --git a/src/systems/dispatcher/multi_thread.rs b/src/systems/dispatcher/multi_thread.rs new file mode 100644 index 0000000..0fc5e42 --- /dev/null +++ b/src/systems/dispatcher/multi_thread.rs @@ -0,0 +1,44 @@ +use ::specs::prelude::*; + +use super::UnifiedDispatcher; + +macro_rules! construct_dispatcher { + ( + $( + ( + $type:ident, + $name:expr, + $deps:expr + ) + ),* + ) => { + fn new_dispatch() -> Box { + use ::specs::DispatcherBuilder; + + let dispatcher = DispatcherBuilder::new() + $( + .with($type{}, $name, $deps) + )* + .build(); + + let dispatch = MultiThreadedDispatcher { + dispatcher: dispatcher + }; + + return Box::new(dispatch); + } + }; +} + +pub struct MultiThreadedDispatcher { + pub dispatcher: ::specs::Dispatcher<'static, 'static>, +} + +impl<'a> UnifiedDispatcher for MultiThreadedDispatcher { + fn run_now(&mut self, ecs: *mut World) { + unsafe { + self.dispatcher.dispatch(&mut *ecs); + crate::effects::run_effects_queue(&mut *ecs); + } + } +} diff --git a/src/systems/dispatcher/single_thread.rs b/src/systems/dispatcher/single_thread.rs index da4247d..9dfdac2 100644 --- a/src/systems/dispatcher/single_thread.rs +++ b/src/systems/dispatcher/single_thread.rs @@ -1,6 +1,5 @@ use ::specs::prelude::*; -use super::super::*; use super::UnifiedDispatcher; macro_rules! construct_dispatcher {