From 9f04ec861ed535d543bb3079df9ccb059431c42a Mon Sep 17 00:00:00 2001 From: tuxmain Date: Sat, 27 Aug 2022 09:35:01 +0200 Subject: [PATCH] opti(particles): fetch ThreadRng only once in a system --- src/game.rs | 3 +-- src/particle_effect.rs | 25 +++++++++++++++++-------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/game.rs b/src/game.rs index 3c7c8fd..c98f48e 100644 --- a/src/game.rs +++ b/src/game.rs @@ -290,8 +290,7 @@ fn collision_event_system( .clamp(Vec4::ZERO, Vec4::ONE); // If color approximately white - if app_state.current() == &AppState::Game - && new_color.min_element() >= 0.9 + if app_state.current() == &AppState::Game && new_color.min_element() >= 0.9 { app_state.replace(AppState::Win).ok(); } diff --git a/src/particle_effect.rs b/src/particle_effect.rs index b711548..26e275a 100644 --- a/src/particle_effect.rs +++ b/src/particle_effect.rs @@ -1,5 +1,5 @@ use bevy::{prelude::*, sprite::Mesh2dHandle}; -use rand::Rng; +use rand::{rngs::ThreadRng, Rng}; use rand_distr::{Distribution, UnitCircle}; #[cfg(not(target_arch = "wasm32"))] @@ -68,15 +68,20 @@ pub struct ParticleComponent { } impl ParticleComponent { - pub fn new() -> Self { + pub fn new(rng: &mut ThreadRng) -> Self { let mut particle_component: Self = Self::default(); - particle_component.randomize_velocity(MIN_VELOCITY, MAX_VELOCITY); + particle_component.randomize_velocity(rng, MIN_VELOCITY, MAX_VELOCITY); particle_component } - pub fn randomize_velocity(&mut self, min_velocity: f32, max_velocity: f32) { - let random_direction: [f32; 2] = UnitCircle.sample(&mut rand::thread_rng()); - let random_magnitude: f32 = rand::thread_rng().gen_range(min_velocity..max_velocity); + pub fn randomize_velocity( + &mut self, + rng: &mut ThreadRng, + min_velocity: f32, + max_velocity: f32, + ) { + let random_direction: [f32; 2] = UnitCircle.sample(rng); + let random_magnitude: f32 = rng.gen_range(min_velocity..max_velocity); self.velocity = Vec3::new(random_direction[0], random_direction[1], 0.0) * random_magnitude; } } @@ -87,6 +92,8 @@ fn particle_effect_startup( particle_mesh: Res, mut materials: ResMut>, ) { + let mut rng = rand::thread_rng(); + for _p in 0..POOL_COUNT { let color_mesh = ColorMesh2dBundle { mesh: particle_mesh.square.clone(), @@ -96,7 +103,7 @@ fn particle_effect_startup( commands .spawn_bundle(color_mesh) - .insert(ParticleComponent::new()); + .insert(ParticleComponent::new(&mut rng)); } } @@ -110,6 +117,8 @@ fn particle_effect_system( mut particle_effect: ResMut, time: Res