diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java index 8dc3aa9df..a90ace090 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/Config.java @@ -1097,6 +1097,25 @@ public class Config + "") .build(); + public static final ConfigEntry numberOfNetworkCompressionThreads = new ConfigEntry.Builder() + .setServersideShortName("numberOfNetworkCompressionThreads") + .setMinDefaultMax(1, + ThreadPresetConfigEventHandler.getNetworkCompressionDefaultThreadCount(), + Runtime.getRuntime().availableProcessors()) + .comment("" + + "How many threads should be used when (de)compressing LODs \n" + + "that are received/sent over the network?\n" + + "\n" + + "This pool doesn't do anything in singleplayer or when connected \n" + + "to a server that doesn't support DH networking. \n" + + "\n" + + THREAD_NOTE) + .build(); + public static final ConfigEntry runTimeRatioForNetworkCompressionThreads = new ConfigEntry.Builder() + .setServersideShortName("runTimeRatioForNetworkCompressionThreads") + .setMinDefaultMax(0.01, ThreadPresetConfigEventHandler.getNetworkCompressionDefaultRunTimeRatio(), 1.0) + .comment(THREAD_RUN_TIME_RATIO_NOTE) + .build(); } public static class AutoUpdater diff --git a/core/src/main/java/com/seibel/distanthorizons/core/config/eventHandlers/presets/ThreadPresetConfigEventHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/config/eventHandlers/presets/ThreadPresetConfigEventHandler.java index 1f668a859..08542169c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/config/eventHandlers/presets/ThreadPresetConfigEventHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/config/eventHandlers/presets/ThreadPresetConfigEventHandler.java @@ -129,6 +129,28 @@ public class ThreadPresetConfigEventHandler extends AbstractPresetConfigEventHan }}); + public static int getNetworkCompressionDefaultThreadCount() { return getThreadCountByPercent(0.3); } + private final ConfigEntryWithPresetOptions networkCompressionThreadCount = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.numberOfNetworkCompressionThreads, + new HashMap() + {{ + this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 1); + this.put(EDhApiThreadPreset.LOW_IMPACT, getNetworkCompressionDefaultThreadCount()); + this.put(EDhApiThreadPreset.BALANCED, getThreadCountByPercent(0.4)); + this.put(EDhApiThreadPreset.AGGRESSIVE, getThreadCountByPercent(0.6)); + this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, getThreadCountByPercent(0.8)); + }}); + public static double getNetworkCompressionDefaultRunTimeRatio() { return 0.5; } + private final ConfigEntryWithPresetOptions networkCompressionRunTime = new ConfigEntryWithPresetOptions<>(Config.Client.Advanced.MultiThreading.runTimeRatioForNetworkCompressionThreads, + new HashMap() + {{ + this.put(EDhApiThreadPreset.MINIMAL_IMPACT, 0.25); + this.put(EDhApiThreadPreset.LOW_IMPACT, getNetworkCompressionDefaultRunTimeRatio()); + this.put(EDhApiThreadPreset.BALANCED, 0.75); + this.put(EDhApiThreadPreset.AGGRESSIVE, 1.0); + this.put(EDhApiThreadPreset.I_PAID_FOR_THE_WHOLE_CPU, 1.0); + }}); + + //==============// // constructors // @@ -150,6 +172,9 @@ public class ThreadPresetConfigEventHandler extends AbstractPresetConfigEventHan this.configList.add(this.lodBuilderThreadCount); this.configList.add(this.lodBuilderRunTime); + this.configList.add(this.networkCompressionThreadCount); + this.configList.add(this.networkCompressionRunTime); + for (ConfigEntryWithPresetOptions config : this.configList) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/util/threading/ThreadPoolUtil.java b/core/src/main/java/com/seibel/distanthorizons/core/util/threading/ThreadPoolUtil.java index f794b039a..fc7ade03b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/util/threading/ThreadPoolUtil.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/util/threading/ThreadPoolUtil.java @@ -71,6 +71,11 @@ public class ThreadPoolUtil @Nullable public static ThreadPoolExecutor getBeaconCullingExecutor() { return beaconCullingThreadPool; } + public static final DhThreadFactory NETWORK_COMPRESSION_THREAD_FACTORY = new DhThreadFactory("Network Compression", Thread.MIN_PRIORITY); + private static ConfigThreadPool networkCompressionThreadPool; + @Nullable + public static ThreadPoolExecutor getNetworkCompressionExecutor() { return networkCompressionThreadPool.executor; } + //======================// @@ -112,6 +117,7 @@ public class ThreadPoolUtil fileHandlerThreadPool = new ConfigThreadPool(FILE_HANDLER_THREAD_FACTORY, Config.Client.Advanced.MultiThreading.numberOfFileHandlerThreads, Config.Client.Advanced.MultiThreading.runTimeRatioForFileHandlerThreads, null); updatePropagatorThreadPool = new ConfigThreadPool(UPDATE_PROPAGATOR_THREAD_FACTORY, Config.Client.Advanced.MultiThreading.numberOfUpdatePropagatorThreads, Config.Client.Advanced.MultiThreading.runTimeRatioForUpdatePropagatorThreads, null); worldGenThreadPool = new ConfigThreadPool(WORLD_GEN_THREAD_FACTORY, Config.Client.Advanced.MultiThreading.numberOfWorldGenerationThreads, Config.Client.Advanced.MultiThreading.runTimeRatioForWorldGenerationThreads, null); + networkCompressionThreadPool = new ConfigThreadPool(NETWORK_COMPRESSION_THREAD_FACTORY, Config.Client.Advanced.MultiThreading.numberOfNetworkCompressionThreads, Config.Client.Advanced.MultiThreading.runTimeRatioForNetworkCompressionThreads, null); bufferUploaderThreadPool = ThreadUtil.makeSingleThreadPool(BUFFER_UPLOADER_THREAD_NAME); cleanupThreadPool = ThreadUtil.makeSingleThreadPool(CLEANUP_THREAD_NAME); beaconCullingThreadPool = ThreadUtil.makeSingleThreadPool(BEACON_CULLING_THREAD_NAME); @@ -153,6 +159,7 @@ public class ThreadPoolUtil fileHandlerThreadPool.shutdownExecutorService(); updatePropagatorThreadPool.shutdownExecutorService(); worldGenThreadPool.shutdownExecutorService(); + networkCompressionThreadPool.shutdownExecutorService(); bufferUploaderThreadPool.shutdown(); cleanupThreadPool.shutdown(); beaconCullingThreadPool.shutdown();