From e9e2af2807b230ef840b93e78bf4df33daf7fa82 Mon Sep 17 00:00:00 2001 From: tom lee Date: Sun, 23 Jan 2022 19:08:19 +0800 Subject: [PATCH] Add optimization on getPosToGenerate. --- .../core/objects/PosToGenerateContainer.java | 10 ++++++++++ .../lod/core/objects/lod/LodDimension.java | 17 ++++++++++++++++- .../seibel/lod/core/objects/lod/LodRegion.java | 3 +++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/seibel/lod/core/objects/PosToGenerateContainer.java b/src/main/java/com/seibel/lod/core/objects/PosToGenerateContainer.java index 15a99dd44..671393352 100644 --- a/src/main/java/com/seibel/lod/core/objects/PosToGenerateContainer.java +++ b/src/main/java/com/seibel/lod/core/objects/PosToGenerateContainer.java @@ -138,6 +138,16 @@ public class PosToGenerateContainer return farSize; } + public int getMaxNumberOfNearPos() + { + return nearPosToGenerate.length; + } + + public int getMaxNumberOfFarPos() + { + return farPosToGenerate.length; + } + // TODO what does getNth mean? could the name be more descriptive or is it just a index? public int getNthDetail(int n, boolean near) { diff --git a/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java b/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java index 89c57fefc..b3bdf96d2 100644 --- a/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java +++ b/src/main/java/com/seibel/lod/core/objects/lod/LodDimension.java @@ -473,6 +473,7 @@ public class LodDimension } if (updated) { region.needRegenBuffer = 2; + region.needRecheckGenPoint = true; regenDimensionBuffers = true; } }); @@ -534,9 +535,23 @@ public class LodDimension //boolean isCloseRange = true; //All of this is handled directly by the region, which scan every pos from top to bottom of the quad tree LodRegion lodRegion = regions[x][z]; - if (lodRegion != null) + + + if (lodRegion != null && lodRegion.needRecheckGenPoint) { + int nearCount = posToGenerate.getNumberOfNearPos(); + int farCount = posToGenerate.getNumberOfFarPos(); + boolean checkForFlag = (nearCount < posToGenerate.getMaxNumberOfNearPos() && farCount < posToGenerate.getMaxNumberOfFarPos()); + if (checkForFlag) { + lodRegion.needRecheckGenPoint = false; + } lodRegion.getPosToGenerate(posToGenerate, playerBlockPosX, playerBlockPosZ, allowedPriority, genMode, isCloseRange); + if (checkForFlag) { + if (nearCount != posToGenerate.getNumberOfNearPos() || farCount != posToGenerate.getNumberOfFarPos()) { + lodRegion.needRecheckGenPoint = true; + } + } + } }); return posToGenerate; } diff --git a/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java b/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java index c0169205c..6af91d7f3 100644 --- a/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java +++ b/src/main/java/com/seibel/lod/core/objects/lod/LodRegion.java @@ -67,6 +67,7 @@ public class LodRegion { /** this region's z RegionPos */ public final int regionPosZ; + public volatile boolean needRecheckGenPoint = true; public volatile int needRegenBuffer = 2; public volatile boolean needSaving = false; public volatile int isWriting = 0; @@ -532,6 +533,7 @@ public class LodRegion { minDetailLevel = levelContainer.getDetailLevel(); dataContainer[levelContainer.getDetailLevel()] = levelContainer; + needRecheckGenPoint = true; } // TODO James thinks cutTree and growTree (which he renamed to match cutTree) @@ -564,6 +566,7 @@ public class LodRegion { dataContainer[detailLevelIndex] = dataContainer[detailLevelIndex + 1].expand(); } minDetailLevel = detailLevel; + needRecheckGenPoint = true; } }