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:
parent
31f8e6b385
commit
344e475f52
@ -36,16 +36,16 @@ public:
|
||||
|
||||
### 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
|
||||
struct Chunk {
|
||||
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_count = 4; // Sub-chunks per side
|
||||
static constexpr uint8_t subchunk_size = /* certain value */; // Tiles per sub-chunk side
|
||||
static constexpr uint8_t subchunk_count = size / subchunk_size; // Sub-chunks per side
|
||||
|
||||
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
|
||||
|
||||
Position within a chunk's 4×4 sub-chunk grid.
|
||||
Position within a chunk's sub-chunk grid.
|
||||
|
||||
```cpp
|
||||
struct SubChunkPos {
|
||||
std::uint8_t sub_x; // 0-3
|
||||
std::uint8_t sub_y; // 0-3
|
||||
std::uint8_t sub_x;
|
||||
std::uint8_t sub_y;
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
// Access tiles
|
||||
for (int chunk_y = 0; chunk_y < 4; ++chunk_y) {
|
||||
for (int chunk_x = 0; chunk_x < 4; ++chunk_x) {
|
||||
for (int chunk_y = 0; chunk_y < Chunk::subchunk_count; ++chunk_y) {
|
||||
for (int chunk_x = 0; chunk_x < Chunk::subchunk_count; ++chunk_x) {
|
||||
const auto& chunk = tilemap.get_chunk(chunk_x, chunk_y);
|
||||
// Process chunk tiles...
|
||||
}
|
||||
@ -270,8 +270,7 @@ std::cout << "Biome: " << props.name << std::endl;
|
||||
## Performance Notes
|
||||
|
||||
- Each chunk contains 4,096 tiles (64×64)
|
||||
- A 4×4 chunk map contains 65,536 total tiles
|
||||
- Sub-chunks provide efficient biome management (16×16 tile regions)
|
||||
- Sub-chunks provide efficient biome management
|
||||
- Tiles are packed into 1 byte each for memory efficiency
|
||||
- Generation uses Perlin noise with uniform distribution mapping for balanced terrain
|
||||
- Noise calibration is performed once during generator construction
|
||||
|
@ -53,10 +53,9 @@ const BiomeProperties &get_biome_properties(BiomeType biome);
|
||||
// Determine biome type based on temperature and humidity
|
||||
BiomeType determine_biome(double temperature, double humidity);
|
||||
|
||||
// Sub-chunk position within a chunk (4x4 grid of 16x16 sub-chunks)
|
||||
struct SubChunkPos {
|
||||
std::uint8_t sub_x; // 0-3
|
||||
std::uint8_t sub_y; // 0-3
|
||||
std::uint8_t sub_x;
|
||||
std::uint8_t sub_y;
|
||||
|
||||
constexpr SubChunkPos(std::uint8_t x, std::uint8_t y): sub_x(x), sub_y(y) {}
|
||||
};
|
||||
|
@ -21,16 +21,16 @@ struct Chunk {
|
||||
// Size of a chunk in tiles (64 x 64)
|
||||
static constexpr uint8_t size = 64;
|
||||
|
||||
// Each sub-chunk is 16x16 tiles
|
||||
static constexpr uint8_t subchunk_size = 16;
|
||||
// Sub-chunk size in tiles
|
||||
static constexpr uint8_t subchunk_size = 4;
|
||||
|
||||
// Number of sub-chunks in each dimension
|
||||
static constexpr uint8_t subchunk_count = size / subchunk_size;
|
||||
|
||||
// 64x64 array of tile types
|
||||
// array of tile types
|
||||
Tile tiles[size][size];
|
||||
|
||||
// 4x4 array of biomes for sub-chunks
|
||||
// array of biomes for sub-chunks
|
||||
BiomeType biome[subchunk_count][subchunk_count];
|
||||
};
|
||||
|
||||
|
@ -71,8 +71,8 @@ void TerrainGenerator::generate_chunk(
|
||||
const Chunk &chunk = tilemap.get_chunk(chunk_x, chunk_y);
|
||||
|
||||
// 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_y = 0; sub_y < 4; ++sub_y) {
|
||||
for (std::uint8_t sub_x = 0; sub_x < Chunk::subchunk_count; ++sub_x) {
|
||||
for (std::uint8_t sub_y = 0; sub_y < Chunk::subchunk_count; ++sub_y) {
|
||||
SubChunkPos sub_pos(sub_x, sub_y);
|
||||
BiomeType biome = chunk.biome[sub_x][sub_y];
|
||||
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
|
||||
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;
|
||||
local_x < start_x + Chunk::subchunk_size; ++local_x) {
|
||||
for (std::uint8_t local_y = start_y;
|
||||
|
Loading…
x
Reference in New Issue
Block a user