From 4c6185556f5d734b00618a4cb050ac3ea30ec68e Mon Sep 17 00:00:00 2001 From: Leonardo Date: Mon, 23 Aug 2021 12:10:55 +0200 Subject: [PATCH] Small fixes --- .../seibel/lod/builders/LodBufferBuilder.java | 102 ++++++++++++------ .../com/seibel/lod/proxy/ClientProxy.java | 4 +- 2 files changed, 69 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 0ab5275eb..28acdcca3 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -66,8 +66,7 @@ public class LodBufferBuilder /** This holds the thread used to generate new LODs off the main thread. */ private ExecutorService mainGenThread = Executors.newSingleThreadExecutor(new LodThreadFactory(this.getClass().getSimpleName() + " - main")); /** This holds the threads used to generate buffers. */ - private ExecutorService bufferBuilderThreads = Executors.newSingleThreadExecutor(new LodThreadFactory(this.getClass().getSimpleName() + " - buffer builder")); - //private ExecutorService bufferBuilderThreads = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new LodThreadFactory(this.getClass().getSimpleName() + " - builder")); + private ExecutorService bufferBuilderThreads = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new LodThreadFactory(this.getClass().getSimpleName() + " - builder")); private LodBuilder LodQuadTreeNodeBuilder; @@ -174,50 +173,54 @@ public class LodBufferBuilder Thread thread = new Thread(() -> { bufferLock.lock(); + + long treeStart = System.currentTimeMillis(); lodDim.treeCutter(playerBlockPosRounded.getX(), playerBlockPosRounded.getZ()); + + long treeEnd = System.currentTimeMillis(); try { long startTime = System.currentTimeMillis(); - + ArrayList chunksToGen = new ArrayList<>(maxChunkGenRequests); // if we don't have a full number of chunks to generate in chunksToGen // we can top it off from the reserve ArrayList chunksToGenReserve = new ArrayList<>(maxChunkGenRequests); ArrayList> builderThreads = new ArrayList<>(lodDim.regions.length * lodDim.regions.length); - + startBuffers(); - + // used when determining which chunks are closer when queuing distance // generation int minChunkDist = Integer.MAX_VALUE; - + // =====================// // RENDERING PART // // =====================// - - + + long renderRequestStart = System.currentTimeMillis(); for (int xRegion = 0; xRegion < lodDim.regions.length; xRegion++) { for (int zRegion = 0; zRegion < lodDim.regions.length; zRegion++) { RegionPos regionPos = new RegionPos(xRegion + lodDim.getCenterX() - lodDim.getWidth() / 2, zRegion + lodDim.getCenterZ() - lodDim.getWidth() / 2); - + // local position in the vbo and bufferBuilder arrays BufferBuilder currentBuffer = buildableBuffers[xRegion][zRegion]; - + // make sure the buffers weren't // changed while we were running this method if (currentBuffer == null || (currentBuffer != null && !currentBuffer.building())) return; - - + + byte detailLevel = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; - + Callable bufferBuildingThread = () -> { - List posListToRender = new ArrayList<>(); - + List posListToRender = new ArrayList<>(); + for (byte detail = detailLevel; detail <= LodUtil.REGION_DETAIL_LEVEL; detail++) { posListToRender.addAll(lodDim.getDataToRender( @@ -228,25 +231,25 @@ public class LodBufferBuilder DetailUtil.getDistanceRendering(detail + 1), detail)); } - - + + for (LevelPos pos : posListToRender) { LevelPos chunkPos = pos.convert(LodUtil.CHUNK_DETAIL_LEVEL); // skip any chunks that Minecraft is going to render - + if (renderer.vanillaRenderedChunks.contains(new ChunkPos(chunkPos.posX, chunkPos.posZ))) { continue; } - + if (lodDim.doesDataExist(pos)) { try { int width = (int) Math.pow(2, pos.detailLevel); LodDataPoint lodData = lodDim.getData(pos); - + if (lodData != null) { LodConfig.CLIENT.lodTemplate.get().template.addLodToBuffer(currentBuffer, lodDim, lodData, @@ -258,20 +261,22 @@ public class LodBufferBuilder return false; } } - + }// for pos to in list to render - + // the thread executed successfully return true; };// buffer builder worker thread - - + + builderThreads.add(bufferBuildingThread); - + }// region z }// region z - - + + long renderRequestEnd = System.currentTimeMillis(); + + long renderStart = System.currentTimeMillis(); // wait for all threads to finish List> futures = bufferBuilderThreads.invokeAll(builderThreads); for(Future future : futures) @@ -284,14 +289,15 @@ public class LodBufferBuilder return; } } - - + long renderEnd = System.currentTimeMillis(); + + // =====================// // GENERATION PART // // =====================// - List posListToGenerate = new ArrayList<>(); + List posListToGenerate; List generationRequestList = new ArrayList<>(); /**TODO can give a totally different generation*/ @@ -314,11 +320,17 @@ public class LodBufferBuilder } } */ - + + long genReqStart = 0; + long genReqEnd = 0; + long genStart = 0; + long genEnd = 0; + if (LodConfig.CLIENT.distanceGenerationMode.get() != DistanceGenerationMode.NONE) { int requesting = maxChunkGenRequests; + genReqStart = System.currentTimeMillis(); /* //we firstly make sure that the world is filled with half region wide block for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++) @@ -338,8 +350,9 @@ public class LodBufferBuilder requesting = maxChunkGenRequests - generationRequestList.size(); } + */ - + //we then fill the world with the rest of the block for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++) { @@ -418,8 +431,10 @@ public class LodBufferBuilder } // lod null and can generate more chunks } // positions to generate - - + + genReqEnd = System.currentTimeMillis(); + + genStart = System.currentTimeMillis(); // queue up chunks to be generated if (mc.hasSingleplayerServer()) { @@ -452,6 +467,7 @@ public class LodBufferBuilder WorldWorkerManager.addWorker(genWorker); } } + genEnd = System.currentTimeMillis(); } // if distanceGenerationMode != DistanceGenerationMode.NONE @@ -464,7 +480,23 @@ public class LodBufferBuilder long endTime = System.currentTimeMillis(); long buildTime = endTime - startTime; - ClientProxy.LOGGER.info("Buffer Build time: " + buildTime + " ms"); + + long treeTime = treeEnd - treeStart; + + long renderingRequestTime = renderRequestEnd - renderRequestStart; + + long renderingTime = renderEnd - renderStart; + + long genReqTime = genReqEnd - genReqStart; + + long genTime = genEnd - genStart; + + ClientProxy.LOGGER.info("Buffer Build time: " + buildTime + " ms" + '\n' + + "Tree cutting time: " + treeTime + " ms" + '\n' + + "Rendering request time: " + renderingRequestTime + " ms" + '\n' + + "Rendering time: " + renderingTime + " ms" + '\n' + + "Generation request time: " + genReqTime + " ms" + '\n' + + "Generation time: " + genTime + " ms"); // mark that the buildable buffers as ready to swap switchVbos = true; diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index b780d1d20..b9470a704 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -139,8 +139,8 @@ public class ClientProxy // LodConfig.CLIENT.drawLODs.set(true); LodConfig.CLIENT.debugMode.set(false); - LodConfig.CLIENT.maxDrawDetail.set(LodDetail.SINGLE); - LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.SINGLE); + LodConfig.CLIENT.maxDrawDetail.set(LodDetail.FULL); + LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.FULL); LodConfig.CLIENT.fogDistance.set(FogDistance.FAR); LodConfig.CLIENT.fogDrawOverride.set(FogDrawOverride.ALWAYS_DRAW_FOG_FANCY);