Use radsort for sprite picking (#17174)
				
					
				
			# Objective Optimization for sprite picking ## Solution Use `radsort` for the sort. We already have `radsort` in tree for sorting various phase items (including `Transparent2d` / sprites). It's a stable parallel radix sort. ## Testing Tested on an M1 Max. `cargo run --example sprite_picking` `cargo run --example bevymark --release --features=trace,trace_tracy -- --waves 100 --per-wave 1000 --benchmark` <img width="983" alt="image" src="https://github.com/user-attachments/assets/0f7a8c3a-006b-4323-a2ed-03788918dffa" />
This commit is contained in:
		
							parent
							
								
									cc4aace1aa
								
							
						
					
					
						commit
						8898c9e142
					
				| @ -2,15 +2,13 @@ | |||||||
| //! sprites with arbitrary transforms. Picking is done based on sprite bounds, not visible pixels.
 | //! sprites with arbitrary transforms. Picking is done based on sprite bounds, not visible pixels.
 | ||||||
| //! This means a partially transparent sprite is pickable even in its transparent areas.
 | //! This means a partially transparent sprite is pickable even in its transparent areas.
 | ||||||
| 
 | 
 | ||||||
| use core::cmp::Reverse; |  | ||||||
| 
 |  | ||||||
| use crate::{Sprite, TextureAtlasLayout}; | use crate::{Sprite, TextureAtlasLayout}; | ||||||
| use bevy_app::prelude::*; | use bevy_app::prelude::*; | ||||||
| use bevy_asset::prelude::*; | use bevy_asset::prelude::*; | ||||||
| use bevy_color::Alpha; | use bevy_color::Alpha; | ||||||
| use bevy_ecs::prelude::*; | use bevy_ecs::prelude::*; | ||||||
| use bevy_image::Image; | use bevy_image::Image; | ||||||
| use bevy_math::{prelude::*, FloatExt, FloatOrd}; | use bevy_math::{prelude::*, FloatExt}; | ||||||
| use bevy_picking::backend::prelude::*; | use bevy_picking::backend::prelude::*; | ||||||
| use bevy_reflect::prelude::*; | use bevy_reflect::prelude::*; | ||||||
| use bevy_render::prelude::*; | use bevy_render::prelude::*; | ||||||
| @ -83,7 +81,11 @@ fn sprite_picking( | |||||||
|             } |             } | ||||||
|         }) |         }) | ||||||
|         .collect(); |         .collect(); | ||||||
|     sorted_sprites.sort_by_key(|x| Reverse(FloatOrd(x.2.translation().z))); | 
 | ||||||
|  |     // radsort is a stable radix sort that performed better than `slice::sort_by_key`
 | ||||||
|  |     radsort::sort_by_key(&mut sorted_sprites, |(_, _, transform, _)| { | ||||||
|  |         -transform.translation().z | ||||||
|  |     }); | ||||||
| 
 | 
 | ||||||
|     let primary_window = primary_window.get_single().ok(); |     let primary_window = primary_window.get_single().ok(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Rob Parrett
						Rob Parrett