Use 4-byte LightmapSlabIndex for batching instead of 16-byte AssetId<Image> (#18326)
Less data accessed and compared gives better batching performance. # Objective - Use a smaller id to represent the lightmap in batch data to enable a faster implementation of draw streams. - Improve batching performance for 3D sorted render phases. ## Solution - 3D batching can use `LightmapSlabIndex` (a `NonMaxU32` which is 4 bytes) instead of the lightmap `AssetId<Image>` (an enum where the largest variant is a 16-byte UUID) to discern the ability to batch. ## Testing Tested main (yellow) vs this PR (red) on an M4 Max using the `many_cubes` example with `WGPU_SETTINGS_PRIO=webgl2` to avoid GPU-preprocessing, and modifying the materials in `many_cubes` to have `AlphaMode::Blend` so that they would rely on the less efficient sorted render phase batching. <img width="1500" alt="Screenshot_2025-03-15_at_12 17 21" src="https://github.com/user-attachments/assets/14709bd3-6d06-40fb-aa51-e1d2d606ebe3" /> A 44.75us or 7.5% reduction in median execution time of the batch and prepare sorted render phase system for the `Transparent3d` phase (handling 160k cubes). --- ## Migration Guide - Changed: `RenderLightmap::new()` no longer takes an `AssetId<Image>` argument for the asset id of the lightmap image.
This commit is contained in:
parent
b462f47864
commit
bc7416aa22
@ -116,9 +116,6 @@ pub struct Lightmap {
|
|||||||
/// There is one of these per visible lightmapped mesh instance.
|
/// There is one of these per visible lightmapped mesh instance.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub(crate) struct RenderLightmap {
|
pub(crate) struct RenderLightmap {
|
||||||
/// The ID of the lightmap texture.
|
|
||||||
pub(crate) image: AssetId<Image>,
|
|
||||||
|
|
||||||
/// The rectangle within the lightmap texture that the UVs are relative to.
|
/// The rectangle within the lightmap texture that the UVs are relative to.
|
||||||
///
|
///
|
||||||
/// The top left coordinate is the `min` part of the rect, and the bottom
|
/// The top left coordinate is the `min` part of the rect, and the bottom
|
||||||
@ -245,7 +242,6 @@ fn extract_lightmaps(
|
|||||||
render_lightmaps.render_lightmaps.insert(
|
render_lightmaps.render_lightmaps.insert(
|
||||||
entity.into(),
|
entity.into(),
|
||||||
RenderLightmap::new(
|
RenderLightmap::new(
|
||||||
lightmap.image.id(),
|
|
||||||
lightmap.uv_rect,
|
lightmap.uv_rect,
|
||||||
slab_index,
|
slab_index,
|
||||||
slot_index,
|
slot_index,
|
||||||
@ -305,14 +301,12 @@ impl RenderLightmap {
|
|||||||
/// Creates a new lightmap from a texture, a UV rect, and a slab and slot
|
/// Creates a new lightmap from a texture, a UV rect, and a slab and slot
|
||||||
/// index pair.
|
/// index pair.
|
||||||
fn new(
|
fn new(
|
||||||
image: AssetId<Image>,
|
|
||||||
uv_rect: Rect,
|
uv_rect: Rect,
|
||||||
slab_index: LightmapSlabIndex,
|
slab_index: LightmapSlabIndex,
|
||||||
slot_index: LightmapSlotIndex,
|
slot_index: LightmapSlotIndex,
|
||||||
bicubic_sampling: bool,
|
bicubic_sampling: bool,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
image,
|
|
||||||
uv_rect,
|
uv_rect,
|
||||||
slab_index,
|
slab_index,
|
||||||
slot_index,
|
slot_index,
|
||||||
|
@ -1905,7 +1905,7 @@ impl GetBatchData for MeshPipeline {
|
|||||||
type CompareData = (
|
type CompareData = (
|
||||||
MaterialBindGroupIndex,
|
MaterialBindGroupIndex,
|
||||||
AssetId<Mesh>,
|
AssetId<Mesh>,
|
||||||
Option<AssetId<Image>>,
|
Option<LightmapSlabIndex>,
|
||||||
);
|
);
|
||||||
|
|
||||||
type BufferData = MeshUniform;
|
type BufferData = MeshUniform;
|
||||||
@ -1946,7 +1946,7 @@ impl GetBatchData for MeshPipeline {
|
|||||||
mesh_instance.should_batch().then_some((
|
mesh_instance.should_batch().then_some((
|
||||||
material_bind_group_index.group,
|
material_bind_group_index.group,
|
||||||
mesh_instance.mesh_asset_id,
|
mesh_instance.mesh_asset_id,
|
||||||
maybe_lightmap.map(|lightmap| lightmap.image),
|
maybe_lightmap.map(|lightmap| lightmap.slab_index),
|
||||||
)),
|
)),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
@ -1976,7 +1976,7 @@ impl GetFullBatchData for MeshPipeline {
|
|||||||
mesh_instance.should_batch().then_some((
|
mesh_instance.should_batch().then_some((
|
||||||
mesh_instance.material_bindings_index.group,
|
mesh_instance.material_bindings_index.group,
|
||||||
mesh_instance.mesh_asset_id,
|
mesh_instance.mesh_asset_id,
|
||||||
maybe_lightmap.map(|lightmap| lightmap.image),
|
maybe_lightmap.map(|lightmap| lightmap.slab_index),
|
||||||
)),
|
)),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user