From 996400726927fb952999afbc36db6e2bfba7d44e Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 7 Apr 2024 22:16:58 +0200 Subject: feat: add some additional perf counters --- src_testbed/ui.rs | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'src_testbed/ui.rs') diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs index 7d50f62..c76b288 100644 --- a/src_testbed/ui.rs +++ b/src_testbed/ui.rs @@ -227,20 +227,21 @@ fn profiling_string(counters: &Counters) -> String { r#"Total: {:.2}ms Collision detection: {:.2}ms |_ Broad-phase: {:.2}ms - Narrow-phase: {:.2}ms + Narrow-phase: {:.2}ms Island computation: {:.2}ms Solver: {:.2}ms |_ Velocity assembly: {:.2}ms - Velocity resolution: {:.2}ms - Velocity integration: {:.2}ms - Position assembly: {:.2}ms - Position resolution: {:.2}ms + Velocity resolution: {:.2}ms + Velocity integration: {:.2}ms + Writeback: {:.2}ms CCD: {:.2}ms |_ # of substeps: {} - TOI computation: {:.2}ms - Broad-phase: {:.2}ms - Narrow-phase: {:.2}ms - Solver: {:.2}ms"#, + TOI computation: {:.2}ms + Broad-phase: {:.2}ms + Narrow-phase: {:.2}ms + Solver: {:.2}ms +Query pipeline: {:.2}ms +User changes: {:.2}ms"#, counters.step_time(), counters.collision_detection_time(), counters.broad_phase_time(), @@ -250,14 +251,15 @@ CCD: {:.2}ms counters.solver.velocity_assembly_time.time(), counters.velocity_resolution_time(), counters.solver.velocity_update_time.time(), - counters.solver.position_assembly_time.time(), - counters.position_resolution_time(), + counters.solver.velocity_writeback_time.time(), counters.ccd_time(), counters.ccd.num_substeps, counters.ccd.toi_computation_time.time(), counters.ccd.broad_phase_time.time(), counters.ccd.narrow_phase_time.time(), counters.ccd.solver_time.time(), + counters.query_pipeline_update_time(), + counters.stages.user_changes.time(), ) } -- cgit From 9c5c14070d0a0b0283f3943c0f95552c395f2b97 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 14 Apr 2024 15:55:20 +0200 Subject: feat: add variable constraints stabilization iteration number --- src_testbed/ui.rs | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'src_testbed/ui.rs') diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs index c76b288..e8b82bd 100644 --- a/src_testbed/ui.rs +++ b/src_testbed/ui.rs @@ -150,6 +150,13 @@ pub fn update_ui( ) .text("num additional frict. iters."), ); + ui.add( + Slider::new( + &mut integration_parameters.max_internal_stabilization_iterations, + 1..=100, + ) + .text("max internal stabilization iters."), + ); } #[cfg(feature = "parallel")] -- cgit From f58b4f7c195ab7acf0778ea65c46ebf37ac8188c Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 21 Apr 2024 18:55:11 +0200 Subject: feat: add warmstarting to contact constraints resolution --- src_testbed/ui.rs | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) (limited to 'src_testbed/ui.rs') diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs index e8b82bd..4df9d87 100644 --- a/src_testbed/ui.rs +++ b/src_testbed/ui.rs @@ -12,6 +12,7 @@ use crate::testbed::{ use crate::PhysicsState; use bevy_egui::egui::Slider; use bevy_egui::{egui, EguiContexts}; +use rapier::dynamics::IntegrationParameters; pub fn update_ui( ui_context: &mut EguiContexts, @@ -109,8 +110,9 @@ pub fn update_ui( .selected_text(format!("{:?}", state.solver_type)) .show_ui(ui, |ui| { let solver_types = [ - RapierSolverType::SmallStepsPgs, - RapierSolverType::StandardPgs, + RapierSolverType::TgsSoft, + RapierSolverType::TgsSoftNoWarmstart, + RapierSolverType::PgsLegacy, ]; for sty in solver_types { changed = ui @@ -122,11 +124,15 @@ pub fn update_ui( if changed { match state.solver_type { - RapierSolverType::SmallStepsPgs => { - integration_parameters.switch_to_small_steps_pgs_solver() + RapierSolverType::TgsSoft => { + *integration_parameters = IntegrationParameters::tgs_soft(); } - RapierSolverType::StandardPgs => { - integration_parameters.switch_to_standard_pgs_solver() + RapierSolverType::TgsSoftNoWarmstart => { + *integration_parameters = + IntegrationParameters::tgs_soft_without_warmstart(); + } + RapierSolverType::PgsLegacy => { + *integration_parameters = IntegrationParameters::pgs_legacy(); } } } @@ -146,17 +152,31 @@ pub fn update_ui( ui.add( Slider::new( &mut integration_parameters.num_additional_friction_iterations, - 1..=40, + 0..=40, ) .text("num additional frict. iters."), ); ui.add( Slider::new( - &mut integration_parameters.max_internal_stabilization_iterations, + &mut integration_parameters.num_internal_stabilization_iterations, 1..=100, ) .text("max internal stabilization iters."), ); + ui.add( + Slider::new(&mut integration_parameters.warmstart_coefficient, 0.0..=1.0) + .text("warmstart coefficient"), + ); + ui.add(Slider::new(&mut integration_parameters.erp, 0.0..=1.0).text("erp")); + ui.add( + Slider::new(&mut integration_parameters.damping_ratio, 0.0..=20.0) + .text("damping ratio"), + ); + ui.add(Slider::new(&mut integration_parameters.joint_erp, 0.0..=1.0).text("joint erp")); + ui.add( + Slider::new(&mut integration_parameters.joint_damping_ratio, 0.0..=20.0) + .text("joint damping ratio"), + ); } #[cfg(feature = "parallel")] -- cgit From 9ba155748e9e90b42b6bd31661e7da3b80f2c122 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 28 Apr 2024 10:52:13 +0200 Subject: chore: clenaup testbed profiling ui --- src_testbed/ui.rs | 126 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 86 insertions(+), 40 deletions(-) (limited to 'src_testbed/ui.rs') diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs index 4df9d87..e18cc65 100644 --- a/src_testbed/ui.rs +++ b/src_testbed/ui.rs @@ -10,7 +10,8 @@ use crate::testbed::{ }; use crate::PhysicsState; -use bevy_egui::egui::Slider; +use bevy_egui::egui::WidgetType::CollapsingHeader; +use bevy_egui::egui::{Slider, Ui}; use bevy_egui::{egui, EguiContexts}; use rapier::dynamics::IntegrationParameters; @@ -80,9 +81,12 @@ pub fn update_ui( ui.separator(); + ui.collapsing("Scene infos", |ui| { + scene_infos_ui(ui, &harness.physics); + }); ui.collapsing("Profile infos", |ui| { ui.horizontal_wrapped(|ui| { - ui.label(profiling_string(&harness.physics.pipeline.counters)) + profiling_ui(ui, &harness.physics.pipeline.counters); }); }); ui.collapsing("Serialization infos", |ui| { @@ -249,45 +253,87 @@ pub fn update_ui( }); } -fn profiling_string(counters: &Counters) -> String { - format!( - r#"Total: {:.2}ms -Collision detection: {:.2}ms -|_ Broad-phase: {:.2}ms - Narrow-phase: {:.2}ms -Island computation: {:.2}ms -Solver: {:.2}ms -|_ Velocity assembly: {:.2}ms - Velocity resolution: {:.2}ms - Velocity integration: {:.2}ms - Writeback: {:.2}ms -CCD: {:.2}ms -|_ # of substeps: {} - TOI computation: {:.2}ms - Broad-phase: {:.2}ms - Narrow-phase: {:.2}ms - Solver: {:.2}ms -Query pipeline: {:.2}ms -User changes: {:.2}ms"#, +fn scene_infos_ui(ui: &mut Ui, physics: &PhysicsState) { + ui.label(format!("# rigid-bodies: {}", physics.bodies.len())); + ui.label(format!("# colliders: {}", physics.colliders.len())); + ui.label(format!("# impulse joint: {}", physics.impulse_joints.len())); + // ui.label(format!( + // "# multibody joint: {}", + // physics.multibody_joints.len() + // )); +} + +fn profiling_ui(ui: &mut Ui, counters: &Counters) { + egui::CollapsingHeader::new(format!( + "Total: {:.2}ms - {} fps", counters.step_time(), - counters.collision_detection_time(), - counters.broad_phase_time(), - counters.narrow_phase_time(), - counters.island_construction_time(), - counters.solver_time(), - counters.solver.velocity_assembly_time.time(), - counters.velocity_resolution_time(), - counters.solver.velocity_update_time.time(), - counters.solver.velocity_writeback_time.time(), - counters.ccd_time(), - counters.ccd.num_substeps, - counters.ccd.toi_computation_time.time(), - counters.ccd.broad_phase_time.time(), - counters.ccd.narrow_phase_time.time(), - counters.ccd.solver_time.time(), - counters.query_pipeline_update_time(), - counters.stages.user_changes.time(), - ) + (1000.0 / counters.step_time()).round() + )) + .id_source("total") + .show(ui, |ui| { + egui::CollapsingHeader::new(format!( + "Collision detection: {:.2}ms", + counters.collision_detection_time() + )) + .id_source("collision detection") + .show(ui, |ui| { + ui.label(format!("Broad-phase: {:.2}ms", counters.broad_phase_time())); + ui.label(format!( + "Narrow-phase: {:.2}ms", + counters.narrow_phase_time() + )); + }); + egui::CollapsingHeader::new(format!("Solver: {:.2}ms", counters.solver_time())) + .id_source("solver") + .show(ui, |ui| { + ui.label(format!( + "Velocity assembly: {:.2}ms", + counters.solver.velocity_assembly_time.time() + )); + ui.label(format!( + "Velocity resolution: {:.2}ms", + counters.velocity_resolution_time() + )); + ui.label(format!( + "Velocity integration: {:.2}ms", + counters.solver.velocity_update_time.time() + )); + ui.label(format!( + "Writeback: {:.2}ms", + counters.solver.velocity_writeback_time.time() + )); + }); + egui::CollapsingHeader::new(format!("CCD: {:.2}ms", counters.ccd_time())) + .id_source("ccd") + .show(ui, |ui| { + ui.label(format!("# of substeps: {}", counters.ccd.num_substeps)); + ui.label(format!( + "TOI computation: {:.2}ms", + counters.ccd.toi_computation_time.time(), + )); + ui.label(format!( + "Broad-phase: {:.2}ms", + counters.ccd.broad_phase_time.time() + )); + ui.label(format!( + "Narrow-phase: {:.2}ms", + counters.ccd.narrow_phase_time.time(), + )); + ui.label(format!("Solver: {:.2}ms", counters.ccd.solver_time.time())); + }); + ui.label(format!( + "Island computation: {:.2}ms", + counters.island_construction_time() + )); + ui.label(format!( + "Query pipeline: {:.2}ms", + counters.query_pipeline_update_time() + )); + ui.label(format!( + "User changes: {:.2}ms", + counters.stages.user_changes.time() + )); + }); } fn serialization_string(timestep_id: usize, physics: &PhysicsState) -> String { -- cgit From 0a9153e273dc0bdd4ba6443bd7f4dcfc671faac3 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 28 Apr 2024 18:23:30 +0200 Subject: chore: clippy fixes --- src_testbed/ui.rs | 1 - 1 file changed, 1 deletion(-) (limited to 'src_testbed/ui.rs') diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs index e18cc65..7f3bdac 100644 --- a/src_testbed/ui.rs +++ b/src_testbed/ui.rs @@ -10,7 +10,6 @@ use crate::testbed::{ }; use crate::PhysicsState; -use bevy_egui::egui::WidgetType::CollapsingHeader; use bevy_egui::egui::{Slider, Ui}; use bevy_egui::{egui, EguiContexts}; use rapier::dynamics::IntegrationParameters; -- cgit From fdd935dbf13d02b3b08a139baca8a96aa5a3247e Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sat, 25 May 2024 11:05:00 +0200 Subject: feat: make the constraints regularization coefficients configurable with angular frequency instead of explicit ERP --- src_testbed/ui.rs | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'src_testbed/ui.rs') diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs index 7f3bdac..491e15c 100644 --- a/src_testbed/ui.rs +++ b/src_testbed/ui.rs @@ -162,7 +162,7 @@ pub fn update_ui( ui.add( Slider::new( &mut integration_parameters.num_internal_stabilization_iterations, - 1..=100, + 0..=100, ) .text("max internal stabilization iters."), ); @@ -170,12 +170,35 @@ pub fn update_ui( Slider::new(&mut integration_parameters.warmstart_coefficient, 0.0..=1.0) .text("warmstart coefficient"), ); - ui.add(Slider::new(&mut integration_parameters.erp, 0.0..=1.0).text("erp")); + + let mut substep_params = *integration_parameters; + substep_params.dt /= substep_params.num_solver_iterations.get() as f32; + let curr_erp = substep_params.erp(); + let curr_cfm_factor = substep_params.cfm_factor(); + ui.add( + Slider::new( + &mut integration_parameters.contact_natural_frequency, + 0.0..=120.0, + ) + .text(format!("contacts Hz (erp = {:.3})", curr_erp)), + ); ui.add( - Slider::new(&mut integration_parameters.damping_ratio, 0.0..=20.0) - .text("damping ratio"), + Slider::new( + &mut integration_parameters.contact_damping_ratio, + 0.0..=20.0, + ) + .text(format!( + "damping ratio (cfm-factor = {:.3})", + curr_cfm_factor + )), + ); + ui.add( + Slider::new( + &mut integration_parameters.joint_natural_frequency, + 0.0..=1200000.0, + ) + .text("joint erp"), ); - ui.add(Slider::new(&mut integration_parameters.joint_erp, 0.0..=1.0).text("joint erp")); ui.add( Slider::new(&mut integration_parameters.joint_damping_ratio, 0.0..=20.0) .text("joint damping ratio"), -- cgit From 174778067db4c61981cedc6cbf7cd7e893328eb5 Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sun, 19 May 2024 15:52:38 +0200 Subject: feat: ui to set the number of simulation steps per frame --- src_testbed/ui.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src_testbed/ui.rs') diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs index 491e15c..11c9bb7 100644 --- a/src_testbed/ui.rs +++ b/src_testbed/ui.rs @@ -172,8 +172,8 @@ pub fn update_ui( ); let mut substep_params = *integration_parameters; - substep_params.dt /= substep_params.num_solver_iterations.get() as f32; - let curr_erp = substep_params.erp(); + substep_params.dt /= substep_params.num_solver_iterations.get() as Real; + let curr_erp = substep_params.erp(); let curr_cfm_factor = substep_params.cfm_factor(); ui.add( Slider::new( @@ -220,6 +220,8 @@ pub fn update_ui( Slider::new(&mut integration_parameters.min_island_size, 1..=10_000) .text("min island size"), ); + ui.add(Slider::new(&mut state.nsteps, 1..=100).text("sims. per frame")); + let mut frequency = integration_parameters.inv_dt().round() as u32; ui.add(Slider::new(&mut frequency, 0..=240).text("frequency (Hz)")); integration_parameters.set_inv_dt(frequency as Real); -- cgit From cdec395d094bfcc1e5c6ea7d49972f7d2ae3e11b Mon Sep 17 00:00:00 2001 From: Sébastien Crozet Date: Sat, 25 May 2024 11:30:41 +0200 Subject: feat: rename cfm_factor, damping_ratio to contact_cfm_factor and contact_damping_ratio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src_testbed/ui.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src_testbed/ui.rs') diff --git a/src_testbed/ui.rs b/src_testbed/ui.rs index 11c9bb7..aa9dc7a 100644 --- a/src_testbed/ui.rs +++ b/src_testbed/ui.rs @@ -173,19 +173,19 @@ pub fn update_ui( let mut substep_params = *integration_parameters; substep_params.dt /= substep_params.num_solver_iterations.get() as Real; - let curr_erp = substep_params.erp(); - let curr_cfm_factor = substep_params.cfm_factor(); + let curr_erp = substep_params.contact_erp(); + let curr_cfm_factor = substep_params.contact_cfm_factor(); ui.add( Slider::new( &mut integration_parameters.contact_natural_frequency, - 0.0..=120.0, + 0.01..=120.0, ) .text(format!("contacts Hz (erp = {:.3})", curr_erp)), ); ui.add( Slider::new( &mut integration_parameters.contact_damping_ratio, - 0.0..=20.0, + 0.01..=20.0, ) .text(format!( "damping ratio (cfm-factor = {:.3})", -- cgit