![]() # Objective - Fix sprite rendering performance regression since retained render world changes - The retained render world changes moved `ExtractedSprites` from using the highly-optimised `EntityHasher` with an `Entity` to using `FixedHasher` with `(Entity, MainEntity)`. This was enough to regress framerate in bevymark by 25%. ## Solution - Move the render world entity into a member of `ExtractedSprite` and change `ExtractedSprites` to use `MainEntityHashMap` for its storage - Disable sprite picking in bevymark ## Testing M4 Max. `bevymark --waves 100 --per-wave 1000 --benchmark`. main in yellow vs PR in red: <img width="590" alt="Screenshot 2025-01-01 at 16 36 22" src="https://github.com/user-attachments/assets/1e4ed6ec-3811-4abf-8b30-336153737f89" /> 20.2% median frame time reduction. <img width="594" alt="Screenshot 2025-01-01 at 16 38 37" src="https://github.com/user-attachments/assets/157c2022-cda6-4cf2-bc63-d0bc40528cf0" /> 49.7% median extract_sprites execution time reduction. Comparing 0.14.2 yellow vs PR red: <img width="593" alt="Screenshot 2025-01-01 at 16 40 06" src="https://github.com/user-attachments/assets/abd59b6f-290a-4eb6-8835-ed110af995f3" /> ~6.1% median frame time reduction. --- ## Migration Guide - `ExtractedSprites` is now using `MainEntityHashMap` for storage, which is keyed on `MainEntity`. - The render world entity corresponding to an `ExtractedSprite` is now stored in the `render_entity` member of it. |
||
---|---|---|
.. | ||
bevymark.rs | ||
many_animated_sprites.rs | ||
many_buttons.rs | ||
many_cameras_lights.rs | ||
many_components.rs | ||
many_cubes.rs | ||
many_foxes.rs | ||
many_gizmos.rs | ||
many_glyphs.rs | ||
many_lights.rs | ||
many_sprites.rs | ||
many_text2d.rs | ||
README.md | ||
text_pipeline.rs | ||
transform_hierarchy.rs | ||
warning_string.txt |
Stress tests
These examples are used to stress test Bevy's performance in various ways. These should be run with the "stress-test" profile to accurately represent performance in production, otherwise they will run in cargo's default "dev" profile which is very slow.
Example Command
cargo run --profile stress-test --example <EXAMPLE>