diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java index ac44fc7fb..33aac5e3b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java @@ -51,8 +51,6 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I private final FullDataSourceRequestHandler requestHandler = new FullDataSourceRequestHandler(this); - private final boolean NSizedGenerationSupported = false; - //=============// // constructor // @@ -217,8 +215,6 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I // world gen // //===========// - public boolean isNSizedGenerationSupported() { return this.NSizedGenerationSupported; } - @Override public void onWorldGenTaskComplete(long pos) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java index 5feb0bd57..132c48177 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/LodQuadTree.java @@ -40,10 +40,7 @@ import org.apache.logging.log4j.Logger; import javax.annotation.WillNotClose; import java.awt.*; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Objects; +import java.util.*; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.atomic.AtomicBoolean; @@ -426,7 +423,7 @@ public class LodQuadTree extends QuadTree implements IDebugRen if (positionsToRequeue.contains(pos)) { // don't attempt to re-load positions that are already in the process of reloading - break; + continue; } try @@ -450,7 +447,6 @@ public class LodQuadTree extends QuadTree implements IDebugRen // if we don't trigger it again the LOD will be out of date // and may be invisible/missing positionsToRequeue.add(pos); - break; } } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/threading/PrioritySemaphore.java b/core/src/main/java/com/seibel/distanthorizons/core/util/threading/PrioritySemaphore.java index cc7a3aed5..0bb7cc5ff 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/util/threading/PrioritySemaphore.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/util/threading/PrioritySemaphore.java @@ -2,9 +2,7 @@ package com.seibel.distanthorizons.core.util.threading; import org.jetbrains.annotations.NotNull; -import java.util.Comparator; import java.util.Random; -import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.PriorityBlockingQueue; import java.util.concurrent.Semaphore; import java.util.concurrent.locks.ReentrantLock; @@ -67,12 +65,16 @@ public class PrioritySemaphore // this has to be outside the try-finally to prevent holding the lock while waiting synchronized (thread) { - // random value between -5 and +5 is used to prevent task starvation - // while still allowing higher priority tasks to run sooner - int priority = executor.priority + this.random.nextInt(11) - 5; + // Calculation rules: + // - Executors with higher priority need less tasks to run before other executors + // If one executor has the priority of 3 and other if of 4, + // the latter one will need 1/4 fewer tasks in queue to get its tasks running + // - Executors with short-lived tasks run before longer lived ones + // 100k value is a multiplier to prevent precision loss + int priority = (int) ((executor.priority + 1) * executor.getTaskCount() * 100000 / executor.getAverageRunTimeInMs()); // this thread will be run when a permit is available - this.queue.put(new ThreadWithPriority(thread,priority)); + this.queue.put(new ThreadWithPriority(thread, priority)); thread.wait(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/threading/RateLimitedThreadPoolExecutor.java b/core/src/main/java/com/seibel/distanthorizons/core/util/threading/RateLimitedThreadPoolExecutor.java index a14c1c4f2..efc8df1da 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/util/threading/RateLimitedThreadPoolExecutor.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/util/threading/RateLimitedThreadPoolExecutor.java @@ -92,8 +92,6 @@ public class RateLimitedThreadPoolExecutor extends ThreadPoolExecutor implements @Override protected void beforeExecute(Thread thread, Runnable runnable) { - super.beforeExecute(thread, runnable); - long deltaMs = TimeUnit.NANOSECONDS.toMillis(this.lastRunDurationNanoTimeRef.get()); this.runTimeInMsRollingAverage.addValue(deltaMs); @@ -124,12 +122,15 @@ public class RateLimitedThreadPoolExecutor extends ThreadPoolExecutor implements this.runStartNanoTimeRef.set(System.nanoTime()); + + super.beforeExecute(thread, runnable); } @Override protected void afterExecute(Runnable runnable, Throwable throwable) { super.afterExecute(runnable, throwable); + this.lastRunDurationNanoTimeRef.set(System.nanoTime() - this.runStartNanoTimeRef.get());