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:
Rob Parrett 2025-01-05 12:28:11 -08:00 committed by GitHub
parent cc4aace1aa
commit 8898c9e142
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2,15 +2,13 @@
//! 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.
use core::cmp::Reverse;
use crate::{Sprite, TextureAtlasLayout};
use bevy_app::prelude::*;
use bevy_asset::prelude::*;
use bevy_color::Alpha;
use bevy_ecs::prelude::*;
use bevy_image::Image;
use bevy_math::{prelude::*, FloatExt, FloatOrd};
use bevy_math::{prelude::*, FloatExt};
use bevy_picking::backend::prelude::*;
use bevy_reflect::prelude::*;
use bevy_render::prelude::*;
@ -83,7 +81,11 @@ fn sprite_picking(
}
})
.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();