perf: eliminate HashMap lookups on z-scroll with fast recolor + targeted boundary dirty
Three optimizations for z-scroll performance: Option 1 — Fast in-place recolor (no HashMap lookups): - TilemapChunkStates stores solid_bits + underground_bits per chunk - recolor_chunk_for_depth iterates flat Vec<Option<TileData>> — pure cache-friendly sequential reads - tile_fade_color computes color from tileset_idx + z_diff without any HashMap access - vs repopulate_chunk_tiles: 32K Vec reads vs 32K HashMap lookups per frame Option 2 — Targeted boundary dirty (from 9×chunks to 2×chunks): - on_camera_z_changed now only marks the 4 boundary z-levels: old_entered, old_exited, new_entered, new_exited - Registry.z_change_keys tracks z-changed keys separately from occlusion dirty_keys - populate_tilemap_chunk_data uses fast recolor for z_change_keys, full repopulate for dirty_keys (occlusion — rare) Option 3 — Separate budgets: - z_change_keys processed with MAX_POPULATE_PER_FRAME budget (fast recolor) - dirty_keys processed with MAX_POPULATE_PER_FRAME budget (full repopulate) - Both pipelines tracked separately in benchmark Also: - populate_chunk_tiles now returns underground_bits for state storage - compute_solid_bits helper extracts solid tiles from TileData Vec - spawn_tilemap_chunks computes and stores both bitmasks on spawn - despawn_tilemap_chunks clears all state for despawned chunks
This commit is contained in:
@@ -26,6 +26,7 @@ impl Plugin for WorldPlugin {
|
||||
.init_resource::<TerrainBlobStorage>()
|
||||
.init_resource::<tiles::TilemapBenchmark>()
|
||||
.init_resource::<tiles::TilemapChunkRegistry>()
|
||||
.init_resource::<tiles::TilemapChunkStates>()
|
||||
.init_resource::<tiles::TilemapChunkSpawner>()
|
||||
.init_resource::<tiles::PreviousZIndex>()
|
||||
.add_message::<GenerateChunkEvent>()
|
||||
|
||||
Reference in New Issue
Block a user