perf: SmallVec inline storage, TOML drop tables, seeded deterministic RNG
- SmallVec<[DropEntry; 2]> replaces Vec in DropTable: zero heap allocation for
all current tiles (0 or 1 entries), spills to heap only at 3+
- DropEntry fields packed to u8 (chance_pct, min_count, max_count): ~12 bytes ->
4 bytes; derives Copy so no extra clones
- Replaced SystemTime pseudo-RNG with dig_rng(pos): PCG-style hash of world SEED
+ tile position. Deterministic per world, same dig = same roll every time
- TOML-driven drop tables: assets/drop_tables.toml (grass=5%/1-2, rock=10%/1,
dirt/air=none). TOML parsed at startup into DropTableRegistry resource
- OnceLock global map for async terrain generation tasks to access drop tables
without Bevy resource borrowing
- terrain.rs: DropTableRegistry::global_get("tile") replaces hardcoded drop_table_for
This commit is contained in:
@@ -4,8 +4,7 @@ use bevy_platform::time::Instant;
|
||||
use noise::{NoiseFn, Perlin};
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use crate::entities::item::drop_table::{DropEntry, DropTable};
|
||||
use crate::entities::item::prefabs::misc::misc_prefabs::MiscPrefab;
|
||||
use crate::entities::item::drop_table::DropTableRegistry;
|
||||
|
||||
use crate::{
|
||||
config::TileRegistry,
|
||||
@@ -17,19 +16,6 @@ use crate::{
|
||||
},
|
||||
};
|
||||
|
||||
fn drop_table_for(tile_name: &str) -> DropTable {
|
||||
match tile_name {
|
||||
"grass" => DropTable(vec![
|
||||
DropEntry::chance(MiscPrefab::Coin, 0.05, 1, 2),
|
||||
]),
|
||||
"dirt" => DropTable::default(),
|
||||
"rock" => DropTable(vec![
|
||||
DropEntry::chance(MiscPrefab::Coin, 0.1, 1, 1),
|
||||
]),
|
||||
_ => DropTable::default(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Thread-safe storage for completed terrain blobs.
|
||||
/// Uses type erasure to avoid Debug bounds on TerrainBlob.
|
||||
type BlobStorage = Arc<Mutex<Box<dyn Send + Sync>>>;
|
||||
@@ -130,7 +116,7 @@ fn generate_terrain_blob(chunk_pos: IVec2) -> TerrainBlob {
|
||||
tile.transparent,
|
||||
tile.astar_weight,
|
||||
[0; 8],
|
||||
drop_table_for("air"),
|
||||
DropTableRegistry::global_get("air"),
|
||||
),
|
||||
));
|
||||
chunk_data.set_floor_tile(
|
||||
@@ -153,7 +139,7 @@ fn generate_terrain_blob(chunk_pos: IVec2) -> TerrainBlob {
|
||||
tile.transparent,
|
||||
tile.astar_weight,
|
||||
[0; 8],
|
||||
drop_table_for("rock"),
|
||||
DropTableRegistry::global_get("rock"),
|
||||
),
|
||||
));
|
||||
chunk_data.set_floor_tile(
|
||||
@@ -176,7 +162,7 @@ fn generate_terrain_blob(chunk_pos: IVec2) -> TerrainBlob {
|
||||
tile.transparent,
|
||||
tile.astar_weight,
|
||||
[0; 8],
|
||||
drop_table_for("dirt"),
|
||||
DropTableRegistry::global_get("dirt"),
|
||||
),
|
||||
));
|
||||
chunk_data.set_floor_tile(
|
||||
@@ -201,7 +187,7 @@ fn generate_terrain_blob(chunk_pos: IVec2) -> TerrainBlob {
|
||||
tile.transparent,
|
||||
tile.astar_weight,
|
||||
[0; 8],
|
||||
drop_table_for("grass"),
|
||||
DropTableRegistry::global_get("grass"),
|
||||
),
|
||||
));
|
||||
chunk_data.set_floor_tile(
|
||||
@@ -225,7 +211,7 @@ fn generate_terrain_blob(chunk_pos: IVec2) -> TerrainBlob {
|
||||
tile.transparent,
|
||||
tile.astar_weight,
|
||||
[0; 8],
|
||||
drop_table_for("dirt"),
|
||||
DropTableRegistry::global_get("dirt"),
|
||||
),
|
||||
));
|
||||
chunk_data.set_floor_tile(
|
||||
@@ -249,7 +235,7 @@ fn generate_terrain_blob(chunk_pos: IVec2) -> TerrainBlob {
|
||||
tile.transparent,
|
||||
tile.astar_weight,
|
||||
[0; 8],
|
||||
drop_table_for("air"),
|
||||
DropTableRegistry::global_get("air"),
|
||||
),
|
||||
));
|
||||
chunk_data.set_floor_tile(
|
||||
|
||||
+4
-1
@@ -34,7 +34,10 @@ pub struct WorldPlugin;
|
||||
|
||||
impl Plugin for WorldPlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.init_resource::<ChunkMap>()
|
||||
let drop_registry = crate::entities::item::drop_table::DropTableRegistry::load();
|
||||
crate::entities::item::drop_table::DropTableRegistry::init_global(&drop_registry);
|
||||
app.insert_resource(drop_registry)
|
||||
.init_resource::<ChunkMap>()
|
||||
.init_resource::<TerrainBlobStorage>()
|
||||
.init_resource::<tiles::TilemapBenchmark>()
|
||||
.init_resource::<tiles::TilemapChunkRegistry>()
|
||||
|
||||
Reference in New Issue
Block a user