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:
+11
-11
@@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"mode": "graphics",
|
"mode": "graphics",
|
||||||
"ticks": 600,
|
"ticks": 600,
|
||||||
"total_time_ms": 3437.1,
|
"total_time_ms": 4351.8,
|
||||||
"avg_fps": 174.6,
|
"avg_fps": 137.9,
|
||||||
"avg_frame_time_ms": 5.70,
|
"avg_frame_time_ms": 7.22,
|
||||||
"p99_frame_time_ms": 13.96,
|
"p99_frame_time_ms": 18.27,
|
||||||
"min_frame_time_ms": 4.45,
|
"min_frame_time_ms": 5.37,
|
||||||
"subsystems": {
|
"subsystems": {
|
||||||
"ca_step_avg_us": 1259,
|
"ca_step_avg_us": 2536,
|
||||||
"ca_step_p99_us": 8885,
|
"ca_step_p99_us": 12072,
|
||||||
"ca_step_min_us": 670,
|
"ca_step_min_us": 736,
|
||||||
"render_avg_us": 3737,
|
"render_avg_us": 3941,
|
||||||
"render_p99_us": 5483,
|
"render_p99_us": 5859,
|
||||||
"render_min_us": 3221
|
"render_min_us": 3281
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+3
-27
@@ -660,10 +660,9 @@ impl Game {
|
|||||||
let px = px as i32;
|
let px = px as i32;
|
||||||
let py = py as i32;
|
let py = py as i32;
|
||||||
let (pcx, pcy, _, _) = self.grid.chunk_at(px, py);
|
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 chunk_size = self.grid.chunk_size as i32;
|
||||||
|
|
||||||
let mut to_generate: Vec<(i32, i32)> = Vec::new();
|
|
||||||
for dy in -radius..=radius {
|
for dy in -radius..=radius {
|
||||||
for dx in -radius..=radius {
|
for dx in -radius..=radius {
|
||||||
let cx = pcx + dx;
|
let cx = pcx + dx;
|
||||||
@@ -675,16 +674,11 @@ impl Game {
|
|||||||
}
|
}
|
||||||
self.grid.ensure_chunk(cx, cy);
|
self.grid.ensure_chunk(cx, cy);
|
||||||
if !self.grid.is_chunk_generated(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 {
|
if let Some(ref dir) = self.cache_dir {
|
||||||
let save_radius = radius + 2;
|
let save_radius = radius + 2;
|
||||||
if self.tick % 10 == 0 {
|
if self.tick % 10 == 0 {
|
||||||
@@ -727,11 +721,6 @@ impl Game {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn update_active_chunks(&mut self) {
|
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() {
|
if !self.grid.is_infinite() {
|
||||||
for e in self.entities.all() {
|
for e in self.entities.all() {
|
||||||
let (cx, cy) = e.center();
|
let (cx, cy) = e.center();
|
||||||
@@ -747,21 +736,8 @@ impl Game {
|
|||||||
|
|
||||||
self.grid.deactivate_all();
|
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() {
|
for (cx, cy) in self.grid.all_chunk_coords() {
|
||||||
if self.grid.get_chunk_dirty(cx, cy).is_some() {
|
self.grid.set_chunk_active(cx, cy, true);
|
||||||
if (cx - pcx).abs() <= 1 && (cy - pcy).abs() <= 1 {
|
|
||||||
self.grid.set_chunk_active(cx, cy, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user