bevy/crates
James Liu 5d821fe1a7 Start running systems while prepare_systems is running (#4919)
# Objective
While using the ParallelExecutor, systems do not actually start until `prepare_systems` completes. In stages where there are large numbers of "empty" systems with very little work to do, this delay adds significant overhead, which can add up over many stages.

## Solution
Immediately and synchronously signal the start of systems that can run without dependencies inside `prepare_systems` instead of waiting for the first executor iteration after `prepare_systems` completes. Any system that is dependent on them still cannot run until after `prepare_systems` completes, but there are a large number of unconstrained systems in the base engine where this is a general benefit in almost every case.

## Performance

This change was tested against `many_foxes` in the default configuration. As this change is sensitive to the overhead around scheduling systems, the spans for measuring system timing, system overhead, and system commands were all commented out for these measurements.

The median stage timings between `main` and this PR are as follows:

|stage|main|this PR|
|:--|:--|:--|
|First|75.54 us|61.61 us|
|LoadAssets|51.05 us|42.32 us|
|PreUpdate|54.6 us|55.56 us|
|Update|61.89 us|51.5 us|
|PostUpdate|7.27 ms|6.71 ms|
|AssetEvents|47.82 us|35.95 us|
|Last|39.19 us|37.71 us|
|reserve_and_flush|57.83 us|48.2 us|
|Extract|1.41 ms|1.28 ms|
|Prepare|554.49 us|502.53 us|
|Queue|216.29 us|207.51 us|
|Sort|67.03 us|60.99 us|
|Render|1.73 ms|1.58 ms|
|Cleanup|33.55 us|30.76 us|
|Clear Entities|18.56 us|17.05 us|
|**full frame**|**11.9 ms**|**10.91 ms**|

For the first few stages, the benefit is small but cumulative over each. For PostUpdate in particular, this allows `parent_update` to run while prepare_systems is running, which is required for the animation and transform propagation systems, which dominate the time spent in the stage, but also frontloads the contention as the other "empty" systems are also running while `parent_update` is running. For Render, where there is just a single large exclusive system, the benefit comes from not waiting on a spuriously scheduled task on the task pool to kick off the system: it's immediately scheduled to run.
2022-09-13 19:28:13 +00:00
..
bevy_animation Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_app Remove unused dependency from bevy_app (#5894) 2022-09-06 15:06:18 +00:00
bevy_asset Update to notify 5.0 stable (#5865) 2022-09-02 15:54:54 +00:00
bevy_audio Remove Sync requirement in Decodable::Decoder (#5819) 2022-08-29 23:02:12 +00:00
bevy_core Fix a small doc typo: grater -> greater (#5970) 2022-09-13 04:36:50 +00:00
bevy_core_pipeline Ensure 2D phase items are sorted before batching (#5942) 2022-09-11 15:26:40 +00:00
bevy_derive Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_diagnostic Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_dylib Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_dynamic_plugin Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_ecs Start running systems while prepare_systems is running (#4919) 2022-09-13 19:28:13 +00:00
bevy_ecs_compile_fail_tests Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_encase_derive Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_gilrs Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_gltf Add associated constant IDENTITY to Transform and friends. (#5340) 2022-08-30 22:10:24 +00:00
bevy_hierarchy Remove duplicate asserts in test (#5648) 2022-08-15 23:03:42 +00:00
bevy_input implement Reflect for Input<T>, some misc improvements to reflect value derive (#5676) 2022-09-07 15:59:50 +00:00
bevy_internal Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_log Make Resource trait opt-in, requiring #[derive(Resource)] V2 (#5577) 2022-08-08 21:36:35 +00:00
bevy_macro_utils Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_math Expose mint feature in bevy_math/glam (#5857) 2022-09-03 03:02:04 +00:00
bevy_mikktspace Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_pbr Add associated constant IDENTITY to Transform and friends. (#5340) 2022-08-30 22:10:24 +00:00
bevy_ptr Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_reflect implement Reflect for Input<T>, some misc improvements to reflect value derive (#5676) 2022-09-07 15:59:50 +00:00
bevy_render Miscellaneous code-quality improvements. (#5860) 2022-09-05 00:30:21 +00:00
bevy_scene Update to ron 0.8 (#5864) 2022-09-02 14:20:49 +00:00
bevy_sprite Add more documentation and tests to collide_aabb::collide() (#5910) 2022-09-12 01:25:34 +00:00
bevy_tasks Bump Version after Release (#5576) 2022-08-05 02:03:05 +00:00
bevy_text make TextLayoutInfo a Component (#4460) 2022-09-06 20:03:40 +00:00
bevy_time Remove last uses of string-labels (#5420) 2022-09-03 18:06:41 +00:00
bevy_transform Remove last uses of string-labels (#5420) 2022-09-03 18:06:41 +00:00
bevy_ui make TextLayoutInfo a Component (#4460) 2022-09-06 20:03:40 +00:00
bevy_utils Remove Sync bound from Local (#5483) 2022-09-12 04:15:55 +00:00
bevy_window Support monitor selection for all window modes. (#5878) 2022-09-06 14:45:44 +00:00
bevy_winit disable window pre creation for ios (#5883) 2022-09-06 15:06:17 +00:00