From c2be58b0f23e0a8d7f7d7e04172c7fe3e03f0407 Mon Sep 17 00:00:00 2001 From: mcrcortex <18544518+MCRcortex@users.noreply.github.com> Date: Wed, 14 May 2025 22:52:49 +1000 Subject: [PATCH] Micro improvements --- .../voxy/client/core/VoxyRenderSystem.java | 2 +- .../core/model/ModelBakerySubsystem.java | 2 +- .../core/rendering/ChunkBoundRenderer.java | 2 +- .../hierachical/AsyncNodeManager.java | 24 +++++++++++++++++-- .../client/core/rendering/util/HiZBuffer.java | 3 ++- .../client/mixin/minecraft/MixinWindow.java | 1 + .../voxy/common/thread/ServiceThreadPool.java | 3 +++ 7 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java b/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java index 62e8fe7c..36881c92 100644 --- a/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java +++ b/src/main/java/me/cortex/voxy/client/core/VoxyRenderSystem.java @@ -215,7 +215,7 @@ public class VoxyRenderSystem { this.renderDistanceTracker.setCenterAndProcess(cameraX, cameraZ); //Done here as is allows less gl state resetup - this.renderer.tickModelService(Math.max(3_000_000-(System.nanoTime()-startTime), 75_000)); + this.renderer.tickModelService(Math.max(3_000_000-(System.nanoTime()-startTime), 500_000)); } TimingStatistics.postDynamic.stop(); diff --git a/src/main/java/me/cortex/voxy/client/core/model/ModelBakerySubsystem.java b/src/main/java/me/cortex/voxy/client/core/model/ModelBakerySubsystem.java index 615ca99c..d6670d88 100644 --- a/src/main/java/me/cortex/voxy/client/core/model/ModelBakerySubsystem.java +++ b/src/main/java/me/cortex/voxy/client/core/model/ModelBakerySubsystem.java @@ -88,7 +88,7 @@ public class ModelBakerySubsystem { do { this.factory.addEntry(i); j++; - if (25>>32)&0xFFFFFFFFL)); - UploadStream.INSTANCE.commit(); } public void reset() { diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/hierachical/AsyncNodeManager.java b/src/main/java/me/cortex/voxy/client/core/rendering/hierachical/AsyncNodeManager.java index d1f8eea5..6e1a2958 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/hierachical/AsyncNodeManager.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/hierachical/AsyncNodeManager.java @@ -69,6 +69,8 @@ public class AsyncNodeManager { private volatile SyncResults resultCache1 = new SyncResults(); private volatile SyncResults resultCache2 = new SyncResults(); + //Yes. this is stupid. yes. it is a large amount of runtime. Is it profiler bias, probably + private ConcurrentLinkedDeque buffersToFreeQueue = new ConcurrentLinkedDeque<>(); //locals for during iteration @@ -148,6 +150,14 @@ public class AsyncNodeManager { .compile(); private void run() { + while (true) { + var buffer = this.buffersToFreeQueue.poll(); + if (buffer == null) { + break; + } + buffer.free(); + } + if (this.workCounter.get() == 0) { LockSupport.park(); if (this.workCounter.get() == 0 || !this.running) {//No work @@ -264,7 +274,7 @@ public class AsyncNodeManager { if (this.workCounter.addAndGet(-workDone) < 0) { try { - Thread.sleep(1); + Thread.sleep(500); } catch (InterruptedException e) { throw new RuntimeException(e); } @@ -461,7 +471,8 @@ public class AsyncNodeManager { var val = iter.next(); var buffer = val.getValue(); UploadStream.INSTANCE.upload(store.getGeometryBuffer(), Integer.toUnsignedLong(val.getIntKey()) * 8L, buffer); - buffer.free();//Free the buffer was uploading + //Put the queue into the buffer queue to free... yes this is stupid that need todo this... + this.buffersToFreeQueue.add(buffer);//buffer.free();//Free the buffer was uploading } UploadStream.INSTANCE.commit(); } @@ -633,6 +644,15 @@ public class AsyncNodeManager { } this.scatterWrite.free(); + + + while (true) { + var buffer = this.buffersToFreeQueue.poll(); + if (buffer == null) { + break; + } + buffer.free(); + } } //Results object, which is to be synced between the render thread and worker thread diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/util/HiZBuffer.java b/src/main/java/me/cortex/voxy/client/core/rendering/util/HiZBuffer.java index 81f18b1d..6f5780dc 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/util/HiZBuffer.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/util/HiZBuffer.java @@ -64,6 +64,8 @@ public class HiZBuffer { this.width = width; this.height = height; + + this.fb.bind(GL_DEPTH_ATTACHMENT, this.texture, 0).verify(); } public void buildMipChain(int srcDepthTex, int width, int height) { @@ -77,7 +79,6 @@ public class HiZBuffer { glBindVertexArray(RenderService.STATIC_VAO); int boundFB = GL11.glGetInteger(GL_DRAW_FRAMEBUFFER_BINDING); this.hiz.bind(); - this.fb.bind(GL_DEPTH_ATTACHMENT, this.texture, 0);//.verify(); glBindFramebuffer(GL_FRAMEBUFFER, this.fb.id); glDepthFunc(GL_ALWAYS); diff --git a/src/main/java/me/cortex/voxy/client/mixin/minecraft/MixinWindow.java b/src/main/java/me/cortex/voxy/client/mixin/minecraft/MixinWindow.java index b43ff250..ec898e26 100644 --- a/src/main/java/me/cortex/voxy/client/mixin/minecraft/MixinWindow.java +++ b/src/main/java/me/cortex/voxy/client/mixin/minecraft/MixinWindow.java @@ -22,6 +22,7 @@ public class MixinWindow { } //Force the current thread priority to be realtime + Thread.currentThread().setPriority(Thread.MAX_PRIORITY); ThreadUtils.SetSelfThreadPriorityWin32(ThreadUtils.WIN32_THREAD_PRIORITY_TIME_CRITICAL); } } diff --git a/src/main/java/me/cortex/voxy/common/thread/ServiceThreadPool.java b/src/main/java/me/cortex/voxy/common/thread/ServiceThreadPool.java index e66e2f78..35c40d99 100644 --- a/src/main/java/me/cortex/voxy/common/thread/ServiceThreadPool.java +++ b/src/main/java/me/cortex/voxy/common/thread/ServiceThreadPool.java @@ -254,6 +254,9 @@ public class ServiceThreadPool { if (this.totalJobWeight.addAndGet(-service.weightPerJob)<0) { throw new IllegalStateException("Total job weight is negative"); } + + //Sleep for a bit after running a job, yeild the thread + Thread.yield(); break; } }