From 3ac13547cd806b5c0c5cb50f051d6f1c85e67d47 Mon Sep 17 00:00:00 2001 From: mckuhei Date: Fri, 5 May 2023 09:59:03 +0800 Subject: [PATCH] Improve experimental threaded chunk compiler. --- .../net/minecraft/src/ChunkBatcher.java | 2 + .../net/minecraft/src/RenderGlobal.java | 39 ++++++++++++++----- .../net/minecraft/src/Tessellator.java | 5 ++- .../net/minecraft/src/WorldRenderer.java | 4 +- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/minecraft/net/minecraft/src/ChunkBatcher.java b/src/minecraft/net/minecraft/src/ChunkBatcher.java index bedad27..b6de94a 100644 --- a/src/minecraft/net/minecraft/src/ChunkBatcher.java +++ b/src/minecraft/net/minecraft/src/ChunkBatcher.java @@ -36,6 +36,8 @@ public class ChunkBatcher implements Runnable { WorldRenderer renderer = todo.poll(); if(renderer == null) return; renderer.updateRenderer(true); +// System.out.println(todo.size()); +// System.out.println(renderer); } } diff --git a/src/minecraft/net/minecraft/src/RenderGlobal.java b/src/minecraft/net/minecraft/src/RenderGlobal.java index 2d66348..83c9141 100644 --- a/src/minecraft/net/minecraft/src/RenderGlobal.java +++ b/src/minecraft/net/minecraft/src/RenderGlobal.java @@ -570,7 +570,7 @@ public class RenderGlobal implements IWorldAccess var14.setPosition(x, var13, z); if (!var15 && var14.needsUpdate) - { + { // WTF this is a unreachable code. this.worldRenderersToUpdate.add(var14); } } @@ -593,6 +593,7 @@ public class RenderGlobal implements IWorldAccess if (var6.needsUpdate && !this.worldRenderersToUpdate.contains(var6)) { this.worldRenderersToUpdate.add(var6); + var6.addedToQueue = false; } } @@ -626,6 +627,15 @@ public class RenderGlobal implements IWorldAccess this.markRenderersForNewPosition(MathHelper.floor_double_BigInteger(par1EntityLiving.posXBig), MathHelper.floor_double(par1EntityLiving.posY), MathHelper.floor_double_BigInteger(par1EntityLiving.posZBig)); Arrays.sort(this.sortedWorldRenderers, new EntitySorter(par1EntityLiving)); } + + if(Constants.COMPILE_CHUNK_ASYNC) { + for (int i = 0; i < sortedWorldRenderers.length; i++) { + WorldRenderer worldRenderer = sortedWorldRenderers[i]; + if(!worldRenderer.isCompiled) { + worldRenderer.compileAllLayers(); + } + } + } RenderHelper.disableStandardItemLighting(); byte var17 = 0; @@ -809,11 +819,12 @@ public class RenderGlobal implements IWorldAccess if (!this.sortedWorldRenderers[var7].skipRenderPass[par3] && this.sortedWorldRenderers[var7].isInFrustum && (!this.occlusionEnabled || this.sortedWorldRenderers[var7].isVisible)) { - int var8 = this.sortedWorldRenderers[var7].getGLCallListForPass(par3); + WorldRenderer worldRenderer = this.sortedWorldRenderers[var7]; + int var8 = worldRenderer.getGLCallListForPass(par3); if (var8 >= 0) { - this.glRenderLists.add(this.sortedWorldRenderers[var7]); + this.glRenderLists.add(worldRenderer); ++var6; } } @@ -1378,6 +1389,7 @@ public class RenderGlobal implements IWorldAccess RenderSorter var4 = new RenderSorter(par1EntityLiving); WorldRenderer[] var5 = new WorldRenderer[var3]; ArrayList var6 = null; + if(Constants.COMPILE_CHUNK_ASYNC) worldRenderersToUpdate.sort(new EntitySorter(par1EntityLiving)); int var7 = this.worldRenderersToUpdate.size(); int var8 = 0; this.theWorld.theProfiler.startSection("nearChunksSearch"); @@ -1393,9 +1405,13 @@ public class RenderGlobal implements IWorldAccess if (var10 != null) { - if(Constants.COMPILE_CHUNK_ASYNC) { - if(!var10.isCompiled) var10.compileAllLayers(); - else chunksToUpdate.add(var10); + this.worldRenderersToUpdate.set(var9, (Object)null); + if(Constants.COMPILE_CHUNK_ASYNC) { + if(!var10.addedToQueue) { + chunksToUpdate.add(var10); + var10.addedToQueue = true; + } + continue; } if (!par2) { @@ -1434,13 +1450,15 @@ public class RenderGlobal implements IWorldAccess continue; } - if (var6 == null) - { - var6 = new ArrayList(); + if(!Constants.COMPILE_CHUNK_ASYNC) { + if (var6 == null) + { + var6 = new ArrayList(); + } + var6.add(var10); } ++var8; - var6.add(var10); this.worldRenderersToUpdate.set(var9, (Object)null); } } @@ -1728,6 +1746,7 @@ public class RenderGlobal implements IWorldAccess { this.worldRenderersToUpdate.add(var20); var20.markDirty(); + var20.addedToQueue = false; } } } diff --git a/src/minecraft/net/minecraft/src/Tessellator.java b/src/minecraft/net/minecraft/src/Tessellator.java index 13145ce..8ad5c03 100644 --- a/src/minecraft/net/minecraft/src/Tessellator.java +++ b/src/minecraft/net/minecraft/src/Tessellator.java @@ -297,12 +297,13 @@ public class Tessellator /** * Clears the tessellator state in preparation for new drawing. */ - private void reset() + public void reset() { this.vertexCount = 0; this.byteBuffer.clear(); this.rawBufferIndex = 0; this.addedVertices = 0; + this.isDrawing = false; } /** @@ -324,8 +325,8 @@ public class Tessellator } else { + this.reset(); this.isDrawing = true; - this.reset(); this.drawMode = par1; this.hasNormals = false; this.hasColor = false; diff --git a/src/minecraft/net/minecraft/src/WorldRenderer.java b/src/minecraft/net/minecraft/src/WorldRenderer.java index bd76cfb..e11dcf6 100644 --- a/src/minecraft/net/minecraft/src/WorldRenderer.java +++ b/src/minecraft/net/minecraft/src/WorldRenderer.java @@ -79,7 +79,7 @@ public class WorldRenderer /** Bytes sent to the GPU */ private int bytesDrawn; - public boolean isCompiled = true; + public boolean isCompiled = true, addedToQueue = false; public WorldRenderer(World par1World, List par2List, BigInteger par3, int par4, BigInteger par5, int par6) { @@ -88,7 +88,6 @@ public class WorldRenderer this.glRenderList = par6; this.setPosition(par3, par4, par5); this.needsUpdate = false; - System.out.println("WorldRenderer.WorldRenderer()"); } /** @@ -183,6 +182,7 @@ public class WorldRenderer if (!var14) { var14 = true; + tessellator.reset(); tessellator.startDrawingQuads(); tessellator.setTranslation((double)(-this.posX.doubleValue()), (double)(-this.posY), (double)(-this.posZ.doubleValue())); }