From a52ca170ac03bc69888b59b1a359621521031671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois?= Date: Tue, 10 Oct 2023 00:45:02 +0200 Subject: [PATCH] foxes shouldn't march in sync (#10070) # Objective - All foxes in `many_foxes` are running in sync - It's scary - It can also be a source of optimisation that won't be useful in a general case ## Solution - Advance the animation of each fox so that they are not synced anymore by default - Add a cli arg to enable them running in sync --- examples/stress_tests/many_foxes.rs | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/examples/stress_tests/many_foxes.rs b/examples/stress_tests/many_foxes.rs index 194100658bd6e..367b437cfbbe7 100644 --- a/examples/stress_tests/many_foxes.rs +++ b/examples/stress_tests/many_foxes.rs @@ -4,6 +4,7 @@ use std::f32::consts::PI; use std::time::Duration; +use argh::FromArgs; use bevy::{ diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}, pbr::CascadeShadowConfigBuilder, @@ -11,14 +12,29 @@ use bevy::{ window::{PresentMode, WindowPlugin}, }; +#[derive(FromArgs, Resource)] +/// `many_foxes` stress test +struct Args { + /// wether all foxes run in sync. + #[argh(switch)] + sync: bool, + + /// total number of foxes. + #[argh(option, default = "1000")] + count: usize, +} + #[derive(Resource)] struct Foxes { count: usize, speed: f32, moving: bool, + sync: bool, } fn main() { + let args: Args = argh::from_env(); + App::new() .add_plugins(( DefaultPlugins.set(WindowPlugin { @@ -33,11 +49,10 @@ fn main() { LogDiagnosticsPlugin::default(), )) .insert_resource(Foxes { - count: std::env::args() - .nth(1) - .map_or(1000, |s| s.parse::().unwrap()), + count: args.count, speed: 2.0, moving: true, + sync: args.sync, }) .insert_resource(AmbientLight { color: Color::WHITE, @@ -200,12 +215,15 @@ fn setup( fn setup_scene_once_loaded( animations: Res, foxes: Res, - mut player: Query<&mut AnimationPlayer>, + mut player: Query<(Entity, &mut AnimationPlayer)>, mut done: Local, ) { if !*done && player.iter().len() == foxes.count { - for mut player in &mut player { + for (entity, mut player) in &mut player { player.play(animations.0[0].clone_weak()).repeat(); + if !foxes.sync { + player.seek_to(entity.index() as f32 / 10.0); + } } *done = true; }