From d0701ce63df2954aa367de2416b8e4d8e0877f96 Mon Sep 17 00:00:00 2001 From: Harrison Date: Thu, 30 Apr 2020 16:26:02 -0500 Subject: [PATCH] Changed async execution setup. Two beta threads with lower thread priority and one alpha with normal thread priority. Implemented use of both in chunk loading. --- .../ca/recrown/islandsurvivalcraft/Utilities.java | 10 ++++++---- .../generation/IslandWorldChunkGenerator.java | 14 +++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/ca/recrown/islandsurvivalcraft/Utilities.java b/src/main/java/ca/recrown/islandsurvivalcraft/Utilities.java index c542e32..ebf6391 100644 --- a/src/main/java/ca/recrown/islandsurvivalcraft/Utilities.java +++ b/src/main/java/ca/recrown/islandsurvivalcraft/Utilities.java @@ -11,7 +11,8 @@ import ca.recrown.islandsurvivalcraft.datatypes.Point2; public class Utilities { public final static int CHUNK_SIZE = 16; - public final static ExecutorService ISC_EXECUTOR = Executors.newFixedThreadPool(2, createThreadFactory()); + public final static ExecutorService ISC_EXECUTOR_ALPHA = Executors.newFixedThreadPool(1, createThreadFactory("ALPHA", Thread.NORM_PRIORITY)); + public final static ExecutorService ISC_EXECUTOR_BETA = Executors.newFixedThreadPool(2, createThreadFactory("BETA", Thread.MIN_PRIORITY)); public static HashMap> invertHashMap(HashMap hashMap) { HashMap> res = new HashMap<>(); @@ -76,11 +77,12 @@ public class Utilities { return worldToLocalChunkCoordinates(worldCoordinates.x, worldCoordinates.y); } - public static ThreadFactory createThreadFactory() { - return new ThreadFactory(){ + public static ThreadFactory createThreadFactory(final String identifier, final int priority) { + return new ThreadFactory() { @Override public Thread newThread(Runnable r) { - Thread thread = new Thread(r, "ISC-worker"); + Thread thread = new Thread(r, String.format("ISC-worker-%s", identifier)); + thread.setPriority(priority); return thread; } }; diff --git a/src/main/java/ca/recrown/islandsurvivalcraft/world/generation/IslandWorldChunkGenerator.java b/src/main/java/ca/recrown/islandsurvivalcraft/world/generation/IslandWorldChunkGenerator.java index bf1a859..b02b4aa 100644 --- a/src/main/java/ca/recrown/islandsurvivalcraft/world/generation/IslandWorldChunkGenerator.java +++ b/src/main/java/ca/recrown/islandsurvivalcraft/world/generation/IslandWorldChunkGenerator.java @@ -28,7 +28,8 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene private final Cache biomeCache = new Cache<>(262144); private final Cache chunkExistenceCache = new Cache<>(32768); private final BiomeSelector biomeSelector = new BiomeSelector(); - private final ExecutorService executor = Utilities.ISC_EXECUTOR; + private final ExecutorService exAlpha = Utilities.ISC_EXECUTOR_ALPHA; + private final ExecutorService exBeta = Utilities.ISC_EXECUTOR_BETA; private volatile World currentWorld; public IslandWorldChunkGenerator() { @@ -46,9 +47,9 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene int maxHeight = world.getMaxHeight(); LinkedList> tasks = new LinkedList<>(); ChunkData chunkData = createChunkData(world); - Future preLoader = executor.submit(() -> { - for (int x = 0; x < Utilities.CHUNK_SIZE; x++) { - for (int z = 0; z < Utilities.CHUNK_SIZE; z++) { + Future preLoader = exAlpha.submit(() -> { + for (int x = Utilities.CHUNK_SIZE - 1; x >= 0; x--) { + for (int z = Utilities.CHUNK_SIZE - 1; z >= 0; z--) { if (Thread.currentThread().isInterrupted()) return false; mapper.getWorldBlockValue(Utilities.CHUNK_SIZE * chunkX + x, Utilities.CHUNK_SIZE * chunkZ + z); } @@ -65,9 +66,8 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene biomeGenerator.generateBiomeColumn(biomes, world, chunkX, chunkZ, localX, localZ, mapper, biomeSelector, temperatureMapGenerator, biomeCache, chunkExistenceCache); } - if (biomes[localX][localZ] == null) throw new IllegalStateException("Biome was null."); - tasks.add(executor.submit(() -> { + tasks.add(exBeta.submit(() -> { for (int y = 0; y < maxHeight; y++) { biomeGrid.setBiome(localX, y, localZ, biomes[localX][localZ]); } @@ -82,7 +82,7 @@ public class IslandWorldChunkGenerator extends ChunkGenerator implements Listene } chunkData.setRegion(0, 0, 0, 16, 1, 16, Material.BEDROCK); - preLoader.cancel(true); + preLoader.cancel(false); try { while (!tasks.isEmpty()) { tasks.poll().get();