refactor: Simplify sub-chunk handling and improve biome management in Chunk and TerrainGenerator

Signed-off-by: szdytom <szdytom@qq.com>
This commit is contained in:
方而静 2025-08-01 22:39:09 +08:00
parent 31f8e6b385
commit 344e475f52
Signed by: szTom
GPG Key ID: 072D999D60C6473C
4 changed files with 19 additions and 21 deletions

View File

@ -36,16 +36,16 @@ public:
### Chunk ### Chunk
Each chunk contains 64×64 tiles and 4×4 sub-chunk biome information. Each chunk contains 64×64 tiles and sub-chunk biome information.
```cpp ```cpp
struct Chunk { struct Chunk {
static constexpr uint8_t size = 64; // Tiles per side static constexpr uint8_t size = 64; // Tiles per side
static constexpr uint8_t subchunk_size = 16; // Tiles per sub-chunk side static constexpr uint8_t subchunk_size = /* certain value */; // Tiles per sub-chunk side
static constexpr uint8_t subchunk_count = 4; // Sub-chunks per side static constexpr uint8_t subchunk_count = size / subchunk_size; // Sub-chunks per side
Tile tiles[size][size]; // 64x64 tile grid Tile tiles[size][size]; // 64x64 tile grid
BiomeType biome[subchunk_count][subchunk_count]; // 4x4 biome grid BiomeType biome[subchunk_count][subchunk_count];
}; };
``` ```
@ -200,12 +200,12 @@ BiomeType determine_biome(double temperature, double humidity);
### SubChunkPos ### SubChunkPos
Position within a chunk's 4×4 sub-chunk grid. Position within a chunk's sub-chunk grid.
```cpp ```cpp
struct SubChunkPos { struct SubChunkPos {
std::uint8_t sub_x; // 0-3 std::uint8_t sub_x;
std::uint8_t sub_y; // 0-3 std::uint8_t sub_y;
}; };
constexpr std::pair<std::uint8_t, std::uint8_t> subchunk_to_tile_start( constexpr std::pair<std::uint8_t, std::uint8_t> subchunk_to_tile_start(
@ -235,8 +235,8 @@ config.base_scale = 0.08;
istd::map_generate(tilemap, config); istd::map_generate(tilemap, config);
// Access tiles // Access tiles
for (int chunk_y = 0; chunk_y < 4; ++chunk_y) { for (int chunk_y = 0; chunk_y < Chunk::subchunk_count; ++chunk_y) {
for (int chunk_x = 0; chunk_x < 4; ++chunk_x) { for (int chunk_x = 0; chunk_x < Chunk::subchunk_count; ++chunk_x) {
const auto& chunk = tilemap.get_chunk(chunk_x, chunk_y); const auto& chunk = tilemap.get_chunk(chunk_x, chunk_y);
// Process chunk tiles... // Process chunk tiles...
} }
@ -270,8 +270,7 @@ std::cout << "Biome: " << props.name << std::endl;
## Performance Notes ## Performance Notes
- Each chunk contains 4,096 tiles (64×64) - Each chunk contains 4,096 tiles (64×64)
- A 4×4 chunk map contains 65,536 total tiles - Sub-chunks provide efficient biome management
- Sub-chunks provide efficient biome management (16×16 tile regions)
- Tiles are packed into 1 byte each for memory efficiency - Tiles are packed into 1 byte each for memory efficiency
- Generation uses Perlin noise with uniform distribution mapping for balanced terrain - Generation uses Perlin noise with uniform distribution mapping for balanced terrain
- Noise calibration is performed once during generator construction - Noise calibration is performed once during generator construction

View File

@ -53,10 +53,9 @@ const BiomeProperties &get_biome_properties(BiomeType biome);
// Determine biome type based on temperature and humidity // Determine biome type based on temperature and humidity
BiomeType determine_biome(double temperature, double humidity); BiomeType determine_biome(double temperature, double humidity);
// Sub-chunk position within a chunk (4x4 grid of 16x16 sub-chunks)
struct SubChunkPos { struct SubChunkPos {
std::uint8_t sub_x; // 0-3 std::uint8_t sub_x;
std::uint8_t sub_y; // 0-3 std::uint8_t sub_y;
constexpr SubChunkPos(std::uint8_t x, std::uint8_t y): sub_x(x), sub_y(y) {} constexpr SubChunkPos(std::uint8_t x, std::uint8_t y): sub_x(x), sub_y(y) {}
}; };

View File

@ -21,16 +21,16 @@ struct Chunk {
// Size of a chunk in tiles (64 x 64) // Size of a chunk in tiles (64 x 64)
static constexpr uint8_t size = 64; static constexpr uint8_t size = 64;
// Each sub-chunk is 16x16 tiles // Sub-chunk size in tiles
static constexpr uint8_t subchunk_size = 16; static constexpr uint8_t subchunk_size = 4;
// Number of sub-chunks in each dimension // Number of sub-chunks in each dimension
static constexpr uint8_t subchunk_count = size / subchunk_size; static constexpr uint8_t subchunk_count = size / subchunk_size;
// 64x64 array of tile types // array of tile types
Tile tiles[size][size]; Tile tiles[size][size];
// 4x4 array of biomes for sub-chunks // array of biomes for sub-chunks
BiomeType biome[subchunk_count][subchunk_count]; BiomeType biome[subchunk_count][subchunk_count];
}; };

View File

@ -71,8 +71,8 @@ void TerrainGenerator::generate_chunk(
const Chunk &chunk = tilemap.get_chunk(chunk_x, chunk_y); const Chunk &chunk = tilemap.get_chunk(chunk_x, chunk_y);
// Generate each sub-chunk with its corresponding biome // Generate each sub-chunk with its corresponding biome
for (std::uint8_t sub_x = 0; sub_x < 4; ++sub_x) { for (std::uint8_t sub_x = 0; sub_x < Chunk::subchunk_count; ++sub_x) {
for (std::uint8_t sub_y = 0; sub_y < 4; ++sub_y) { for (std::uint8_t sub_y = 0; sub_y < Chunk::subchunk_count; ++sub_y) {
SubChunkPos sub_pos(sub_x, sub_y); SubChunkPos sub_pos(sub_x, sub_y);
BiomeType biome = chunk.biome[sub_x][sub_y]; BiomeType biome = chunk.biome[sub_x][sub_y];
generate_subchunk(tilemap, chunk_x, chunk_y, sub_pos, biome); generate_subchunk(tilemap, chunk_x, chunk_y, sub_pos, biome);
@ -89,7 +89,7 @@ void TerrainGenerator::generate_subchunk(
// Get starting tile coordinates for this sub-chunk // Get starting tile coordinates for this sub-chunk
auto [start_x, start_y] = subchunk_to_tile_start(sub_pos); auto [start_x, start_y] = subchunk_to_tile_start(sub_pos);
// Generate terrain for each tile in the 16x16 sub-chunk // Generate terrain for each tile in the sub-chunk
for (std::uint8_t local_x = start_x; for (std::uint8_t local_x = start_x;
local_x < start_x + Chunk::subchunk_size; ++local_x) { local_x < start_x + Chunk::subchunk_size; ++local_x) {
for (std::uint8_t local_y = start_y; for (std::uint8_t local_y = start_y;