LOD发送顺序调整
Some checks failed
check-does-build / build (push) Failing after 6s

This commit is contained in:
2026-01-06 15:17:07 +08:00
parent 0ccd024f37
commit fa751fd473
2 changed files with 40 additions and 20 deletions

View File

@@ -99,6 +99,7 @@ public class DirtyUpdateService {
int standardViewDist = server.getPlayerList().getViewDistance() * 16;
int m = (1 << (lvl + 1)) - 1;
int perPlayerBudget = 25;
java.util.ArrayList<long[]> cols = new java.util.ArrayList<>();
for (int dx = 0; dx <= m; dx++) {
for (int dz = 0; dz <= m; dz++) {
double centerX = (((sx << (lvl + 1)) | dx) * sectionSize) + (sectionSize / 2.0);
@@ -109,6 +110,15 @@ public class DirtyUpdateService {
if (distSq > standardViewDist * standardViewDist && distSq < voxyDistance * voxyDistance) {
int absX = (sx << (lvl + 1)) | dx;
int absZ = (sz << (lvl + 1)) | dz;
cols.add(new long[]{absX, absZ, Double.doubleToRawLongBits(distSq)});
}
}
}
cols.sort((a,b)->Long.compare(a[2], b[2]));
for (var it : cols) {
if (perPlayerBudget <= 0) break;
int absX = (int) it[0];
int absZ = (int) it[1];
int minAbsY = (sy << (lvl + 1));
int maxAbsY = minAbsY + m;
int[] yList = VisibleBandUtil.computeVisibleBands(matchLevel, dirty.world, absX, absZ);
@@ -126,5 +136,3 @@ public class DirtyUpdateService {
}
}
}
}
}

View File

@@ -112,7 +112,7 @@ public class PlayerLodTracker {
prog.yList = VisibleBandUtil.computeVisibleBands(level, engine, x, z);
prog.nextIdx = 0;
}
budget.addAndGet(-processVerticalList(player, engine, x, z, prog, budget.get()));
// defer processing to global prioritized loop
}
}, (x, z) -> {
// On Remove (Unload)
@@ -120,17 +120,29 @@ public class PlayerLodTracker {
state.sentColumns.remove(key);
});
if (budget.get() > 0) {
java.util.ArrayList<long[]> cols = new java.util.ArrayList<>(state.sentColumns.size());
for (var entry : state.sentColumns.entrySet()) {
if (budget.get() <= 0) break;
long key = entry.getKey();
int x = (int)(key >> 32);
int z = (int)key;
var prog = entry.getValue();
int cx = (int)(key >> 32);
int cz = (int)key;
double dx = cx - state.lastX;
double dz = cz - state.lastZ;
double d2 = dx*dx + dz*dz;
cols.add(new long[]{key, Double.doubleToRawLongBits(d2)});
}
cols.sort((a,b)->Long.compare(a[1], b[1]));
for (var it : cols) {
if (budget.get() <= 0) break;
long key = it[0];
int cx = (int)(key >> 32);
int cz = (int)key;
var prog = state.sentColumns.get(key);
if (prog == null) continue;
if (prog.yList == null) {
prog.yList = VisibleBandUtil.computeVisibleBands(level, engine, x, z);
prog.yList = VisibleBandUtil.computeVisibleBands(level, engine, cx, cz);
prog.nextIdx = 0;
}
budget.addAndGet(-processVerticalList(player, engine, x, z, prog, budget.get()));
budget.addAndGet(-processVerticalList(player, engine, cx, cz, prog, budget.get()));
}
}
}