fix: all loaded chunks now simulate at same tick rate

- stream_chunks: generate all chunks in radius 2 immediately (was gen_budget=2)
  No more half-generated chunks in active area
- update_active_chunks: activate ALL loaded chunks (was radius 2 around player)
  Physics consistent across all loaded chunks — no frozen boundaries
- streaming radius 3→2 (5x5=25 chunks, all active and simulated)
- 131 FPS surface, 138 FPS caves, p99 17ms
This commit is contained in:
Emil
2026-06-22 16:45:24 +03:00
parent 01a350aebd
commit 5ca8b7e917
2 changed files with 14 additions and 38 deletions
+11 -11
View File
@@ -1,17 +1,17 @@
{
"mode": "graphics",
"ticks": 600,
"total_time_ms": 3437.1,
"avg_fps": 174.6,
"avg_frame_time_ms": 5.70,
"p99_frame_time_ms": 13.96,
"min_frame_time_ms": 4.45,
"total_time_ms": 4351.8,
"avg_fps": 137.9,
"avg_frame_time_ms": 7.22,
"p99_frame_time_ms": 18.27,
"min_frame_time_ms": 5.37,
"subsystems": {
"ca_step_avg_us": 1259,
"ca_step_p99_us": 8885,
"ca_step_min_us": 670,
"render_avg_us": 3737,
"render_p99_us": 5483,
"render_min_us": 3221
"ca_step_avg_us": 2536,
"ca_step_p99_us": 12072,
"ca_step_min_us": 736,
"render_avg_us": 3941,
"render_p99_us": 5859,
"render_min_us": 3281
}
}
+3 -27
View File
@@ -660,10 +660,9 @@ impl Game {
let px = px as i32;
let py = py as i32;
let (pcx, pcy, _, _) = self.grid.chunk_at(px, py);
let radius = 3;
let radius = 2;
let chunk_size = self.grid.chunk_size as i32;
let mut to_generate: Vec<(i32, i32)> = Vec::new();
for dy in -radius..=radius {
for dx in -radius..=radius {
let cx = pcx + dx;
@@ -675,16 +674,11 @@ impl Game {
}
self.grid.ensure_chunk(cx, cy);
if !self.grid.is_chunk_generated(cx, cy) {
to_generate.push((cx, cy));
WorldGenerator::new(&mut self.ca).generate_chunk(&mut self.grid, cx, cy);
}
}
}
let gen_budget = 2;
for &(cx, cy) in to_generate.iter().take(gen_budget) {
WorldGenerator::new(&mut self.ca).generate_chunk(&mut self.grid, cx, cy);
}
if let Some(ref dir) = self.cache_dir {
let save_radius = radius + 2;
if self.tick % 10 == 0 {
@@ -727,11 +721,6 @@ impl Game {
}
fn update_active_chunks(&mut self) {
let chunk_size = self.grid.chunk_size as i32;
let (px, py) = self.player.center(&self.entities);
let pcx = px as i32 / chunk_size;
let pcy = py as i32 / chunk_size;
if !self.grid.is_infinite() {
for e in self.entities.all() {
let (cx, cy) = e.center();
@@ -747,21 +736,8 @@ impl Game {
self.grid.deactivate_all();
for dy in -2..=2 {
for dx in -2..=2 {
self.grid.set_chunk_active(pcx + dx, pcy + dy, true);
}
}
for e in self.entities.all() {
let (cx, cy) = e.center();
self.grid.activate_around(cx as i32, cy as i32, 1);
}
for (cx, cy) in self.grid.all_chunk_coords() {
if self.grid.get_chunk_dirty(cx, cy).is_some() {
if (cx - pcx).abs() <= 1 && (cy - pcy).abs() <= 1 {
self.grid.set_chunk_active(cx, cy, true);
}
}
self.grid.set_chunk_active(cx, cy, true);
}
}