From 080d82c3db7610a2f63b7b00a849c0f371e04a3b Mon Sep 17 00:00:00 2001 From: mckuhei Date: Thu, 4 May 2023 13:01:38 +0800 Subject: [PATCH] Add a experimental threaded chunk compiler. --- .../net/minecraft/src/ChunkBatcher.java | 41 ++++++++ .../net/minecraft/src/Constants.java | 3 +- .../minecraft/src/NoiseGeneratorPerlin.java | 16 ++-- .../minecraft/src/NoiseGeneratorPerlin2.java | 16 ++-- .../minecraft/src/NoiseGeneratorPerlin64.java | 16 ++-- .../net/minecraft/src/RenderBlocks.java | 94 ++++++++++--------- .../net/minecraft/src/RenderGlobal.java | 85 ++++++++++------- .../net/minecraft/src/Tessellator.java | 49 +++++++--- src/minecraft/net/minecraft/src/World.java | 15 ++- .../net/minecraft/src/WorldRenderer.java | 46 ++++++--- 10 files changed, 252 insertions(+), 129 deletions(-) create mode 100644 src/minecraft/net/minecraft/src/ChunkBatcher.java diff --git a/src/minecraft/net/minecraft/src/ChunkBatcher.java b/src/minecraft/net/minecraft/src/ChunkBatcher.java new file mode 100644 index 0000000..bedad27 --- /dev/null +++ b/src/minecraft/net/minecraft/src/ChunkBatcher.java @@ -0,0 +1,41 @@ +package net.minecraft.src; + +import java.util.Queue; + +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Display; + +import net.minecraft.client.Minecraft; + +public class ChunkBatcher implements Runnable { + + private static final ThreadLocal tessellators = new ThreadLocal<>(); + private final Minecraft mc; + private final Queue todo; + + public ChunkBatcher(Minecraft mc, Queue todo) { + this.mc = mc; + this.todo = todo; + } + + @Override + public void run() { + while(mc.running) { + compileChunks(); + if(todo.isEmpty()) { + try { + Thread.sleep(10L); + } catch (InterruptedException e) { + break; + } + } + } + } + + private void compileChunks() { + WorldRenderer renderer = todo.poll(); + if(renderer == null) return; + renderer.updateRenderer(true); + } + +} diff --git a/src/minecraft/net/minecraft/src/Constants.java b/src/minecraft/net/minecraft/src/Constants.java index c08fb2e..6764f33 100644 --- a/src/minecraft/net/minecraft/src/Constants.java +++ b/src/minecraft/net/minecraft/src/Constants.java @@ -7,7 +7,8 @@ public class Constants { public static boolean DISABLE_MODULO = false, USE_64BIT_PERLIN_GENERATOR = false, ENABLE_FRINGE_LAND = false, - FLOAT_PERLIN_GENERATOR = false; + FLOAT_PERLIN_GENERATOR = false, + COMPILE_CHUNK_ASYNC = false; static { Unsafe unsafe; diff --git a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin.java b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin.java index b481988..fcd6d5b 100644 --- a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin.java +++ b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin.java @@ -44,7 +44,7 @@ public class NoiseGeneratorPerlin extends NoiseGenerator return par3 + par1 * (par5 - par3); } - public final double grad2(int par1, double par2, double par4) + public final double grad2d(int par1, double par2, double par4) { int var6 = par1 & 15; double var7 = (double)(1 - ((var6 & 8) >> 3)) * par2; @@ -52,7 +52,7 @@ public class NoiseGeneratorPerlin extends NoiseGenerator return ((var6 & 1) == 0 ? var7 : -var7) + ((var6 & 2) == 0 ? var9 : -var9); } - public final double grad(int par1, double par2, double par4, double par6) + public final double grad3d(int par1, double par2, double par4, double par6) { int var8 = par1 & 15; double var9 = var8 < 8 ? par2 : par4; @@ -120,8 +120,8 @@ public class NoiseGeneratorPerlin extends NoiseGenerator int var66 = this.permutations[var19] + var41; int var67 = this.permutations[var34 + 1] + 0; var22 = this.permutations[var67] + var41; - var70 = this.lerp(var35, this.grad2(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); - var73 = this.lerp(var35, this.grad(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); + var70 = this.lerp(var35, this.grad2d(this.permutations[var66], var31, var38), this.grad3d(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); + var73 = this.lerp(var35, this.grad3d(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad3d(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); double var79 = this.lerp(var42, var70, var73); var10001 = var75++; par1ArrayOfDouble[var10001] += FLOAT_PERLIN_GENERATOR ? (float) (var79 * var77) : var79 * var77; @@ -195,10 +195,10 @@ public class NoiseGeneratorPerlin extends NoiseGenerator int var74 = this.permutations[var41 + 1] + var55; var75 = this.permutations[var74] + var48; int var76 = this.permutations[var74 + 1] + var48; - var29 = this.lerp(var42, this.grad(this.permutations[var71], var38, var52, var45), this.grad(this.permutations[var75], var38 - 1.0D, var52, var45)); - var31 = this.lerp(var42, this.grad(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45)); - var33 = this.lerp(var42, this.grad(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D)); - var35 = this.lerp(var42, this.grad(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D)); + var29 = this.lerp(var42, this.grad3d(this.permutations[var71], var38, var52, var45), this.grad3d(this.permutations[var75], var38 - 1.0D, var52, var45)); + var31 = this.lerp(var42, this.grad3d(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad3d(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45)); + var33 = this.lerp(var42, this.grad3d(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad3d(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D)); + var35 = this.lerp(var42, this.grad3d(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad3d(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D)); } double var58 = this.lerp(var56, var29, var31); diff --git a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin2.java b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin2.java index 0d7abd4..b3cf6f8 100644 --- a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin2.java +++ b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin2.java @@ -44,7 +44,7 @@ public class NoiseGeneratorPerlin2 extends NoiseGenerator return par3 + par1 * (par5 - par3); } - public final double grad2(int par1, double par2, double par4) + public final double grad2d(int par1, double par2, double par4) { int var6 = par1 & 15; double var7 = (double)(1 - ((var6 & 8) >> 3)) * par2; @@ -52,7 +52,7 @@ public class NoiseGeneratorPerlin2 extends NoiseGenerator return ((var6 & 1) == 0 ? var7 : -var7) + ((var6 & 2) == 0 ? var9 : -var9); } - public final double grad(int par1, double par2, double par4, double par6) + public final double grad3d(int par1, double par2, double par4, double par6) { int var8 = par1 & 15; double var9 = var8 < 8 ? par2 : par4; @@ -119,8 +119,8 @@ public class NoiseGeneratorPerlin2 extends NoiseGenerator int var66 = this.permutations[var19] + var41; int var67 = this.permutations[var34 + 1] + 0; var22 = this.permutations[var67] + var41; - var70 = this.lerp(var35, this.grad2(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); - var73 = this.lerp(var35, this.grad(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); + var70 = this.lerp(var35, this.grad2d(this.permutations[var66], var31, var38), this.grad3d(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); + var73 = this.lerp(var35, this.grad3d(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad3d(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); double var79 = this.lerp(var42, var70, var73); var10001 = var75++; par1ArrayOfDouble[var10001] += FLOAT_PERLIN_GENERATOR ? (float) (var79 * var77) : var79 * var77; @@ -194,10 +194,10 @@ public class NoiseGeneratorPerlin2 extends NoiseGenerator int var74 = this.permutations[var41 + 1] + var55; var75 = this.permutations[var74] + var48; int var76 = this.permutations[var74 + 1] + var48; - var29 = this.lerp(var42, this.grad(this.permutations[var71], var38, var52, var45), this.grad(this.permutations[var75], var38 - 1.0D, var52, var45)); - var31 = this.lerp(var42, this.grad(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45)); - var33 = this.lerp(var42, this.grad(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D)); - var35 = this.lerp(var42, this.grad(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D)); + var29 = this.lerp(var42, this.grad3d(this.permutations[var71], var38, var52, var45), this.grad3d(this.permutations[var75], var38 - 1.0D, var52, var45)); + var31 = this.lerp(var42, this.grad3d(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad3d(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45)); + var33 = this.lerp(var42, this.grad3d(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad3d(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D)); + var35 = this.lerp(var42, this.grad3d(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad3d(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D)); } double var58 = this.lerp(var56, var29, var31); diff --git a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin64.java b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin64.java index a55b320..bb29c0b 100644 --- a/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin64.java +++ b/src/minecraft/net/minecraft/src/NoiseGeneratorPerlin64.java @@ -44,7 +44,7 @@ public class NoiseGeneratorPerlin64 extends NoiseGenerator return par3 + par1 * (par5 - par3); } - public final double func_76309_a(int par1, double par2, double par4) + public final double grad2d(int par1, double par2, double par4) { int var6 = par1 & 15; double var7 = (double)(1 - ((var6 & 8) >> 3)) * par2; @@ -52,7 +52,7 @@ public class NoiseGeneratorPerlin64 extends NoiseGenerator return ((var6 & 1) == 0 ? var7 : -var7) + ((var6 & 2) == 0 ? var9 : -var9); } - public final double grad(int par1, double par2, double par4, double par6) + public final double grad3d(int par1, double par2, double par4, double par6) { int var8 = par1 & 15; double var9 = var8 < 8 ? par2 : par4; @@ -120,8 +120,8 @@ public class NoiseGeneratorPerlin64 extends NoiseGenerator int var66 = (int) (this.permutations[var19] + var41); int var67 = this.permutations[var34 + 1] + 0; var22 = (int) (this.permutations[var67] + var41); - var70 = this.lerp(var35, this.func_76309_a(this.permutations[var66], var31, var38), this.grad(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); - var73 = this.lerp(var35, this.grad(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); + var70 = this.lerp(var35, this.grad2d(this.permutations[var66], var31, var38), this.grad3d(this.permutations[var22], var31 - 1.0D, 0.0D, var38)); + var73 = this.lerp(var35, this.grad3d(this.permutations[var66 + 1], var31, 0.0D, var38 - 1.0D), this.grad3d(this.permutations[var22 + 1], var31 - 1.0D, 0.0D, var38 - 1.0D)); double var79 = this.lerp(var42, var70, var73); var10001 = var75++; par1ArrayOfDouble[var10001] += FLOAT_PERLIN_GENERATOR ? (float) (var79 * var77) : var79 * var77; @@ -195,10 +195,10 @@ public class NoiseGeneratorPerlin64 extends NoiseGenerator int var74 = this.permutations[var41 + 1] + var55; var75 = this.permutations[var74] + var48; int var76 = this.permutations[var74 + 1] + var48; - var29 = this.lerp(var42, this.grad(this.permutations[var71], var38, var52, var45), this.grad(this.permutations[var75], var38 - 1.0D, var52, var45)); - var31 = this.lerp(var42, this.grad(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45)); - var33 = this.lerp(var42, this.grad(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D)); - var35 = this.lerp(var42, this.grad(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D)); + var29 = this.lerp(var42, this.grad3d(this.permutations[var71], var38, var52, var45), this.grad3d(this.permutations[var75], var38 - 1.0D, var52, var45)); + var31 = this.lerp(var42, this.grad3d(this.permutations[var72], var38, var52 - 1.0D, var45), this.grad3d(this.permutations[var76], var38 - 1.0D, var52 - 1.0D, var45)); + var33 = this.lerp(var42, this.grad3d(this.permutations[var71 + 1], var38, var52, var45 - 1.0D), this.grad3d(this.permutations[var75 + 1], var38 - 1.0D, var52, var45 - 1.0D)); + var35 = this.lerp(var42, this.grad3d(this.permutations[var72 + 1], var38, var52 - 1.0D, var45 - 1.0D), this.grad3d(this.permutations[var76 + 1], var38 - 1.0D, var52 - 1.0D, var45 - 1.0D)); } double var58 = this.lerp(var56, var29, var31); diff --git a/src/minecraft/net/minecraft/src/RenderBlocks.java b/src/minecraft/net/minecraft/src/RenderBlocks.java index 1416703..0fa961f 100644 --- a/src/minecraft/net/minecraft/src/RenderBlocks.java +++ b/src/minecraft/net/minecraft/src/RenderBlocks.java @@ -331,6 +331,8 @@ public class RenderBlocks * Grass flag for ambient occlusion on Center X, Negative Y, and Positive Z */ private boolean aoGrassXYZCNP; + + private Tessellator tessellator = Tessellator.instance; public RenderBlocks(IBlockAccess par1IBlockAccess) { @@ -425,7 +427,7 @@ public class RenderBlocks */ private boolean renderBlockBed(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = this.blockAccess.getBlockMetadata(par2, par3, par4); int var7 = BlockBed.getDirection(var6); boolean var8 = BlockBed.isBlockHeadOfBed(var6); @@ -582,7 +584,7 @@ public class RenderBlocks par1BlockBrewingStand.setBlockBounds(0.125F, 0.0F, 0.5625F, 0.5F, 0.125F, 0.9375F); this.renderStandardBlock(par1BlockBrewingStand, par2, par3, par4); this.clearOverrideBlockTexture(); - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; var5.setBrightness(par1BlockBrewingStand.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); float var6 = 1.0F; int var7 = par1BlockBrewingStand.colorMultiplier(this.blockAccess, par2, par3, par4); @@ -650,7 +652,7 @@ public class RenderBlocks private boolean renderBlockCauldron(BlockCauldron par1BlockCauldron, BigInteger par2, int par3, BigInteger par4) { this.renderStandardBlock(par1BlockCauldron, par2, par3, par4); - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; var5.setBrightness(par1BlockCauldron.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); float var6 = 1.0F; int var7 = par1BlockCauldron.colorMultiplier(this.blockAccess, par2, par3, par4); @@ -703,7 +705,7 @@ public class RenderBlocks public boolean renderBlockTorch(Block par1Block, BigInteger par2, int par3, BigInteger par4) { int var5 = this.blockAccess.getBlockMetadata(par2, par3, par4); - Tessellator var6 = Tessellator.instance; + Tessellator var6 = tessellator; var6.setBrightness(par1Block.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); var6.setColorOpaque_F(1.0F, 1.0F, 1.0F); double var7 = 0.4000000059604645D; @@ -743,7 +745,7 @@ public class RenderBlocks int var6 = var5 & 3; int var7 = (var5 & 12) >> 2; this.renderStandardBlock(par1Block, par2, par3, par4); - Tessellator var8 = Tessellator.instance; + Tessellator var8 = tessellator; var8.setBrightness(par1Block.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); var8.setColorOpaque_F(1.0F, 1.0F, 1.0F); double var9 = -0.1875D; @@ -963,7 +965,7 @@ public class RenderBlocks int var17 = (var16 & 15) << 4; int var18 = var16 & 240; - Tessellator var19 = Tessellator.instance; + Tessellator var19 = tessellator; double var20 = (double)((float)(var17 + 0) / 256.0F); double var22 = (double)((float)(var18 + 0) / 256.0F); double var24 = ((double)var17 + par14 - 0.01D) / 256.0D; @@ -989,7 +991,7 @@ public class RenderBlocks int var17 = (var16 & 15) << 4; int var18 = var16 & 240; - Tessellator var19 = Tessellator.instance; + Tessellator var19 = tessellator; double var20 = (double)((float)(var17 + 0) / 256.0F); double var22 = (double)((float)(var18 + 0) / 256.0F); double var24 = ((double)var17 + par14 - 0.01D) / 256.0D; @@ -1015,7 +1017,7 @@ public class RenderBlocks int var17 = (var16 & 15) << 4; int var18 = var16 & 240; - Tessellator var19 = Tessellator.instance; + Tessellator var19 = tessellator; double var20 = (double)((float)(var17 + 0) / 256.0F); double var22 = (double)((float)(var18 + 0) / 256.0F); double var24 = ((double)var17 + par14 - 0.01D) / 256.0D; @@ -1140,7 +1142,7 @@ public class RenderBlocks int var5 = this.blockAccess.getBlockMetadata(par2, par3, par4); int var6 = var5 & 7; boolean var7 = (var5 & 8) > 0; - Tessellator var8 = Tessellator.instance; + Tessellator var8 = tessellator; boolean var9 = this.overrideBlockTexture >= 0; if (!var9) @@ -1369,7 +1371,7 @@ public class RenderBlocks public boolean func_78577_f(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = this.blockAccess.getBlockMetadata(par2, par3, par4); int var7 = var6 & 3; boolean var8 = (var6 & 4) == 4; @@ -1751,7 +1753,7 @@ public class RenderBlocks public boolean func_78619_g(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = par1Block.getBlockTextureFromSide(0); int var7 = this.blockAccess.getBlockMetadata(par2, par3, par4); boolean var8 = (var7 & 4) == 4; @@ -1890,7 +1892,7 @@ public class RenderBlocks */ public boolean renderBlockFire(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = par1Block.getBlockTextureFromSide(0); if (this.overrideBlockTexture >= 0) @@ -2103,7 +2105,7 @@ public class RenderBlocks */ public boolean renderBlockRedstoneWire(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = this.blockAccess.getBlockMetadata(par2, par3, par4); int var7 = par1Block.getBlockTextureFromSideAndMetadata(1, var6); @@ -2343,7 +2345,7 @@ public class RenderBlocks */ public boolean renderBlockMinecartTrack(BlockRail par1BlockRail, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = this.blockAccess.getBlockMetadata(par2, par3, par4); int var7 = par1BlockRail.getBlockTextureFromSideAndMetadata(0, var6); @@ -2434,7 +2436,7 @@ public class RenderBlocks */ public boolean renderBlockLadder(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = par1Block.getBlockTextureFromSide(0); if (this.overrideBlockTexture >= 0) @@ -2495,7 +2497,7 @@ public class RenderBlocks */ public boolean renderBlockVine(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = par1Block.getBlockTextureFromSide(0); if (this.overrideBlockTexture >= 0) @@ -2581,7 +2583,7 @@ public class RenderBlocks public boolean renderBlockPane(BlockPane par1BlockPane, BigInteger par2, int par3, BigInteger par4) { int var5 = this.blockAccess.getHeight(); - Tessellator var6 = Tessellator.instance; + Tessellator var6 = tessellator; var6.setBrightness(par1BlockPane.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); float var7 = 1.0F; int var8 = par1BlockPane.colorMultiplier(this.blockAccess, par2, par3, par4); @@ -3027,7 +3029,7 @@ public class RenderBlocks */ public boolean renderCrossedSquares(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; var5.setBrightness(par1Block.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); float var6 = 1.0F; int var7 = par1Block.colorMultiplier(this.blockAccess, par2, par3, par4); @@ -3069,7 +3071,7 @@ public class RenderBlocks public boolean renderBlockStem(Block par1Block, BigInteger par2, int par3, BigInteger par4) { BlockStem var5 = (BlockStem)par1Block; - Tessellator var6 = Tessellator.instance; + Tessellator var6 = tessellator; var6.setBrightness(var5.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); float var7 = 1.0F; int var8 = var5.colorMultiplier(this.blockAccess, par2, par3, par4); @@ -3109,7 +3111,7 @@ public class RenderBlocks */ public boolean renderBlockCrops(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; var5.setBrightness(par1Block.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); var5.setColorOpaque_F(1.0F, 1.0F, 1.0F); this.renderBlockCropsImpl(par1Block, this.blockAccess.getBlockMetadata(par2, par3, par4), par2.doubleValue(), (double)((float)par3 - 0.0625F), par4.doubleValue()); @@ -3121,7 +3123,7 @@ public class RenderBlocks */ public void renderTorchAtAngle(Block par1Block, double par2, double par4, double par6, double par8, double par10) { - Tessellator var12 = Tessellator.instance; + Tessellator var12 = tessellator; int var13 = par1Block.getBlockTextureFromSide(0); if (this.overrideBlockTexture >= 0) @@ -3174,7 +3176,7 @@ public class RenderBlocks */ public void drawCrossedSquares(Block par1Block, int par2, double par3, double par5, double par7) { - Tessellator var9 = Tessellator.instance; + Tessellator var9 = tessellator; int var10 = par1Block.getBlockTextureFromSideAndMetadata(0, par2); if (this.overrideBlockTexture >= 0) @@ -3215,7 +3217,7 @@ public class RenderBlocks */ public void renderBlockStemSmall(Block par1Block, int par2, double par3, double par5, double par7, double par9) { - Tessellator var11 = Tessellator.instance; + Tessellator var11 = tessellator; int var12 = par1Block.getBlockTextureFromSideAndMetadata(0, par2); if (this.overrideBlockTexture >= 0) @@ -3256,7 +3258,7 @@ public class RenderBlocks */ public boolean renderBlockLilyPad(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; int var6 = par1Block.blockIndexInTexture; if (this.overrideBlockTexture >= 0) @@ -3297,7 +3299,7 @@ public class RenderBlocks */ public void renderBlockStemBig(Block par1Block, int par2, int par3, double par4, double par6, double par8, double par10) { - Tessellator var12 = Tessellator.instance; + Tessellator var12 = tessellator; int var13 = par1Block.getBlockTextureFromSideAndMetadata(0, par2) + 16; if (this.overrideBlockTexture >= 0) @@ -3354,7 +3356,7 @@ public class RenderBlocks */ public void renderBlockCropsImpl(Block par1Block, int par2, double par3, double par5, double par7) { - Tessellator var9 = Tessellator.instance; + Tessellator var9 = tessellator; int var10 = par1Block.getBlockTextureFromSideAndMetadata(0, par2); if (this.overrideBlockTexture >= 0) @@ -3415,7 +3417,7 @@ public class RenderBlocks */ public boolean renderBlockFluids(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; if(Minecraft.FIX_RENDERER) var5.setDontTranslate(true); int var6 = par1Block.colorMultiplier(this.blockAccess, par2, par3, par4); float var7 = (float)(var6 >> 16 & 255) / 255.0F; @@ -3693,7 +3695,7 @@ public class RenderBlocks float var8 = 1.0F; float var9 = 0.8F; float var10 = 0.6F; - Tessellator var11 = Tessellator.instance; + Tessellator var11 = tessellator; var11.startDrawingQuads(); var11.setBrightness(par1Block.getMixedBrightnessForBlock(par2World, par3, par4, par5)); float var12 = 1.0F; @@ -3834,7 +3836,7 @@ public class RenderBlocks int var24 = var19; int var25 = var19; - if(Minecraft.FIX_RENDERER) Tessellator.instance.setDontTranslate(true); + if(Minecraft.FIX_RENDERER) tessellator.setDontTranslate(true); if (par1Block.minY <= 0.0D) { @@ -3866,7 +3868,7 @@ public class RenderBlocks var25 = par1Block.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4.add(BigInteger.ONE)); } - Tessellator var26 = Tessellator.instance; + Tessellator var26 = tessellator; var26.setBrightness(983055); this.aoGrassXYZPPC = Block.canBlockGrass[this.blockAccess.getBlockId(par2.add(BigInteger.ONE), par3 + 1, par4)]; this.aoGrassXYZPNC = Block.canBlockGrass[this.blockAccess.getBlockId(par2.add(BigInteger.ONE), par3 - 1, par4)]; @@ -4610,7 +4612,7 @@ public class RenderBlocks var8 = true; } - if(Minecraft.FIX_RENDERER) Tessellator.instance.setDontTranslate(false); + if(Minecraft.FIX_RENDERER) tessellator.setDontTranslate(false); this.enableAO = false; return var8; } @@ -4644,7 +4646,7 @@ public class RenderBlocks public boolean renderStandardBlockWithColorMultiplier(Block par1Block, BigInteger par2, int par3, BigInteger par4, float par5, float par6, float par7) { this.enableAO = false; - Tessellator var8 = Tessellator.instance; + Tessellator var8 = tessellator; boolean var9 = false; float var10 = 0.5F; float var11 = 1.0F; @@ -4678,7 +4680,7 @@ public class RenderBlocks int var26 = par1Block.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4); - if(Minecraft.FIX_RENDERER) Tessellator.instance.setDontTranslate(true); + if(Minecraft.FIX_RENDERER) tessellator.setDontTranslate(true); if (this.renderAllFaces || par1Block.shouldSideBeRendered(this.blockAccess, par2, par3 - 1, par4, 0)) { @@ -4772,14 +4774,14 @@ public class RenderBlocks var9 = true; } - if(Minecraft.FIX_RENDERER) Tessellator.instance.setDontTranslate(false); + if(Minecraft.FIX_RENDERER) tessellator.setDontTranslate(false); return var9; } private boolean func_78616_a(BlockCocoa par1BlockCocoa, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; var5.setBrightness(par1BlockCocoa.getMixedBrightnessForBlock(this.blockAccess, par2, par3, par4)); var5.setColorOpaque_F(1.0F, 1.0F, 1.0F); int var6 = this.blockAccess.getBlockMetadata(par2, par3, par4); @@ -4965,7 +4967,7 @@ public class RenderBlocks */ public boolean renderBlockCactusImpl(Block par1Block, BigInteger par2, int par3, BigInteger par4, float par5, float par6, float par7) { - Tessellator var8 = Tessellator.instance; + Tessellator var8 = tessellator; boolean var9 = false; float var10 = 0.5F; float var11 = 1.0F; @@ -5399,7 +5401,7 @@ public class RenderBlocks */ public boolean renderBlockDoor(Block par1Block, BigInteger par2, int par3, BigInteger par4) { - Tessellator var5 = Tessellator.instance; + Tessellator var5 = tessellator; BlockDoor var6 = (BlockDoor)par1Block; boolean var7 = false; float var8 = 0.5F; @@ -5475,7 +5477,7 @@ public class RenderBlocks */ public void renderBottomFace(Block par1Block, double par2, double par4, double par6, int par8) { - Tessellator var9 = Tessellator.instance; + Tessellator var9 = tessellator; if (this.overrideBlockTexture >= 0) { @@ -5579,7 +5581,7 @@ public class RenderBlocks */ public void renderTopFace(Block par1Block, double par2, double par4, double par6, int par8) { - Tessellator var9 = Tessellator.instance; + Tessellator var9 = tessellator; if (this.overrideBlockTexture >= 0) { @@ -5683,7 +5685,7 @@ public class RenderBlocks */ public void renderEastFace(Block par1Block, double par2, double par4, double par6, int par8) { - Tessellator var9 = Tessellator.instance; + Tessellator var9 = tessellator; if (this.overrideBlockTexture >= 0) { @@ -5795,7 +5797,7 @@ public class RenderBlocks */ public void renderWestFace(Block par1Block, double par2, double par4, double par6, int par8) { - Tessellator var9 = Tessellator.instance; + Tessellator var9 = tessellator; if (this.overrideBlockTexture >= 0) { @@ -5907,7 +5909,7 @@ public class RenderBlocks */ public void renderNorthFace(Block par1Block, double par2, double par4, double par6, int par8) { - Tessellator var9 = Tessellator.instance; + Tessellator var9 = tessellator; if (this.overrideBlockTexture >= 0) { @@ -6019,7 +6021,7 @@ public class RenderBlocks */ public void renderSouthFace(Block par1Block, double par2, double par4, double par6, int par8) { - Tessellator var9 = Tessellator.instance; + Tessellator var9 = tessellator; if (this.overrideBlockTexture >= 0) { @@ -6131,7 +6133,7 @@ public class RenderBlocks */ public void renderBlockAsItem(Block par1Block, int par2, float par3) { - Tessellator var4 = Tessellator.instance; + Tessellator var4 = tessellator; boolean var5 = par1Block.blockID == Block.grass.blockID; int var6; float var7; @@ -6533,4 +6535,8 @@ public class RenderBlocks { return par0 == 0 ? true : (par0 == 31 ? true : (par0 == 13 ? true : (par0 == 10 ? true : (par0 == 11 ? true : (par0 == 27 ? true : (par0 == 22 ? true : (par0 == 21 ? true : (par0 == 16 ? true : par0 == 26)))))))); } + + public void setTessellator(Tessellator tessellator) { + this.tessellator = tessellator; + } } diff --git a/src/minecraft/net/minecraft/src/RenderGlobal.java b/src/minecraft/net/minecraft/src/RenderGlobal.java index a241839..2d66348 100644 --- a/src/minecraft/net/minecraft/src/RenderGlobal.java +++ b/src/minecraft/net/minecraft/src/RenderGlobal.java @@ -11,7 +11,10 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Queue; import java.util.Random; +import java.util.concurrent.ConcurrentLinkedQueue; + import net.minecraft.client.Minecraft; import org.lwjgl.opengl.ARBOcclusionQuery; import org.lwjgl.opengl.GL11; @@ -146,6 +149,9 @@ public class RenderGlobal implements IWorldAccess * The offset used to determine if a renderer is one of the sixteenth that are being updated this frame */ int frustumCheckOffset = 0; + + private Queue chunksToUpdate; + private ChunkBatcher chunkBatcher; public RenderGlobal(Minecraft par1Minecraft, RenderEngine par2RenderEngine) { @@ -213,6 +219,16 @@ public class RenderGlobal implements IWorldAccess var5.draw(); GL11.glEndList(); + if(Constants.COMPILE_CHUNK_ASYNC) { + chunksToUpdate = new ConcurrentLinkedQueue<>(); + chunkBatcher = new ChunkBatcher(mc, chunksToUpdate); + int workers = Math.max(Runtime.getRuntime().availableProcessors() / 2, 1); + for(int i = 0; i < workers; i++) { + Thread thread = new Thread(chunkBatcher, "ChunkBatcher-" + i); + thread.setDaemon(true); + thread.start(); + } + } } private void renderStars() @@ -1377,6 +1393,10 @@ public class RenderGlobal implements IWorldAccess if (var10 != null) { + if(Constants.COMPILE_CHUNK_ASYNC) { + if(!var10.isCompiled) var10.compileAllLayers(); + else chunksToUpdate.add(var10); + } if (!par2) { if (var10.distanceToEntitySquared(par1EntityLiving) > 256.0F) @@ -1426,50 +1446,51 @@ public class RenderGlobal implements IWorldAccess } this.theWorld.theProfiler.endSection(); - this.theWorld.theProfiler.startSection("sort"); + if(!Constants.COMPILE_CHUNK_ASYNC) { + this.theWorld.theProfiler.startSection("sort"); - if (var6 != null) - { - if (var6.size() > 1) + if (var6 != null) { - Collections.sort(var6, var4); - } + if (var6.size() > 1) + { + Collections.sort(var6, var4); + } - for (var9 = var6.size() - 1; var9 >= 0; --var9) - { - var10 = (WorldRenderer)var6.get(var9); - var10.updateRenderer(); - var10.needsUpdate = false; + for (var9 = var6.size() - 1; var9 >= 0; --var9) + { + var10 = (WorldRenderer)var6.get(var9); + var10.updateRenderer(false); + } } - } - - this.theWorld.theProfiler.endSection(); - var9 = 0; - this.theWorld.theProfiler.startSection("rebuild"); - int var16; - for (var16 = var3 - 1; var16 >= 0; --var16) - { - WorldRenderer var17 = var5[var16]; + this.theWorld.theProfiler.endSection(); + var9 = 0; + this.theWorld.theProfiler.startSection("rebuild"); + int var16; - if (var17 != null) + for (var16 = var3 - 1; var16 >= 0; --var16) { - if (!var17.isInFrustum && var16 != var3 - 1) + WorldRenderer var17 = var5[var16]; + + if (var17 != null) { - var5[var16] = null; - var5[0] = null; - break; - } + if (!var17.isInFrustum && var16 != var3 - 1) + { + var5[var16] = null; + var5[0] = null; + break; + } - var5[var16].updateRenderer(); - var5[var16].needsUpdate = false; - ++var9; + var5[var16].updateRenderer(false); + ++var9; + } } - } - this.theWorld.theProfiler.endSection(); + this.theWorld.theProfiler.endSection(); + } + this.theWorld.theProfiler.startSection("cleanup"); - var16 = 0; + int var16 = 0; var11 = 0; for (var12 = this.worldRenderersToUpdate.size(); var16 != var12; ++var16) diff --git a/src/minecraft/net/minecraft/src/Tessellator.java b/src/minecraft/net/minecraft/src/Tessellator.java index 1b4f5a1..13145ce 100644 --- a/src/minecraft/net/minecraft/src/Tessellator.java +++ b/src/minecraft/net/minecraft/src/Tessellator.java @@ -5,6 +5,8 @@ import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.nio.ShortBuffer; +import java.util.Arrays; + import org.lwjgl.opengl.ARBVertexBufferObject; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GLContext; @@ -101,7 +103,7 @@ public class Tessellator private int normal; /** The static instance of the Tessellator. */ - public static final Tessellator instance = new Tessellator(2097152); + public static final Tessellator instance = new Tessellator(0); /** Whether this tessellator is currently in draw mode. */ private boolean isDrawing = false; @@ -126,14 +128,11 @@ public class Tessellator private boolean dontTranslate = false; - private Tessellator(int par1) + Tessellator(int par1) { this.bufferSize = par1; - this.byteBuffer = GLAllocation.createDirectByteBuffer(par1 * 4); - this.intBuffer = this.byteBuffer.asIntBuffer(); - this.floatBuffer = this.byteBuffer.asFloatBuffer(); - this.shortBuffer = this.byteBuffer.asShortBuffer(); this.rawBuffer = new int[par1]; + createBuffers(); this.useVBO = tryVBO && GLContext.getCapabilities().GL_ARB_vertex_buffer_object; if (this.useVBO) @@ -143,12 +142,19 @@ public class Tessellator } } - /** + private void createBuffers() { + this.byteBuffer = GLAllocation.createDirectByteBuffer(this.bufferSize * 4); + this.intBuffer = this.byteBuffer.asIntBuffer(); + this.floatBuffer = this.byteBuffer.asFloatBuffer(); + this.shortBuffer = this.byteBuffer.asShortBuffer(); + } + + /** * Draws the data set up in this tessellator and resets the state to prepare for new drawing. */ public int draw() { - if (!this.isDrawing) + if (!this.isDrawing()) { throw new IllegalStateException("Not tesselating!"); } @@ -159,6 +165,9 @@ public class Tessellator if (this.vertexCount > 0) { this.intBuffer.clear(); + if(intBuffer.remaining() < this.bufferSize) { + createBuffers(); + } this.intBuffer.put(this.rawBuffer, 0, this.rawBufferIndex); this.byteBuffer.position(0); this.byteBuffer.limit(this.rawBufferIndex * 4); @@ -309,7 +318,7 @@ public class Tessellator */ public void startDrawing(int par1) { - if (this.isDrawing) + if (this.isDrawing()) { throw new IllegalStateException("Already tesselating!"); } @@ -442,6 +451,10 @@ public class Tessellator public void addVertex(double par1, double par3, double par5) { ++this.addedVertices; + + if(this.rawBufferIndex >= this.bufferSize - 32) { + grow(32); + } if (this.drawMode == 7 && convertQuadsToTriangles && this.addedVertices % 4 == 0) { @@ -506,11 +519,15 @@ public class Tessellator this.rawBufferIndex += 8; ++this.vertexCount; - if (this.vertexCount % 4 == 0 && this.rawBufferIndex >= this.bufferSize - 32) - { - this.draw(); - this.isDrawing = true; - } +// if (this.vertexCount % 4 == 0 && this.rawBufferIndex >= this.bufferSize - 32) +// { +// this.draw(); +// this.isDrawing = true; +// } + } + + private void grow(int size) { + this.rawBuffer = Arrays.copyOf(this.rawBuffer, this.bufferSize += size); } /** @@ -578,4 +595,8 @@ public class Tessellator public void setDontTranslate(boolean dontTranslate) { this.dontTranslate = dontTranslate; } + + public boolean isDrawing() { + return isDrawing; + } } diff --git a/src/minecraft/net/minecraft/src/World.java b/src/minecraft/net/minecraft/src/World.java index c285765..bbdedd2 100644 --- a/src/minecraft/net/minecraft/src/World.java +++ b/src/minecraft/net/minecraft/src/World.java @@ -8,6 +8,7 @@ import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; public abstract class World implements IBlockAccess { @@ -130,6 +131,9 @@ public abstract class World implements IBlockAccess /** * Gets the biome for a given set of x/z coordinates */ + + private final AtomicInteger blockUpdateDepth = new AtomicInteger(); + public BiomeGenBase getBiomeGenForCoords(BigInteger par1, BigInteger par2) { if (this.blockExists(par1, 0, par2)) @@ -593,7 +597,16 @@ public abstract class World implements IBlockAccess if (var5 != null) { - var5.onNeighborBlockChange(this, par1, par2, par3, par4); + if(blockUpdateDepth.getAndIncrement() >= 100) { + blockUpdateDepth.getAndDecrement(); + return; + } + try { + var5.onNeighborBlockChange(this, par1, par2, par3, par4); + } catch(StackOverflowError e) { + // Oops + } + blockUpdateDepth.getAndDecrement(); } } } diff --git a/src/minecraft/net/minecraft/src/WorldRenderer.java b/src/minecraft/net/minecraft/src/WorldRenderer.java index f20307f..bd76cfb 100644 --- a/src/minecraft/net/minecraft/src/WorldRenderer.java +++ b/src/minecraft/net/minecraft/src/WorldRenderer.java @@ -13,7 +13,7 @@ public class WorldRenderer /** Reference to the World object. */ public World worldObj; private int glRenderList = -1; - private static Tessellator tessellator = Tessellator.instance; + private Tessellator[] tessellators = Constants.COMPILE_CHUNK_ASYNC ? new Tessellator[] {new Tessellator(0), new Tessellator(0)} : null; public static int chunksUpdated = 0; public BigInteger posX; public int posY; @@ -78,6 +78,8 @@ public class WorldRenderer /** Bytes sent to the GPU */ private int bytesDrawn; + + public boolean isCompiled = true; public WorldRenderer(World par1World, List par2List, BigInteger par3, int par4, BigInteger par5, int par6) { @@ -86,6 +88,7 @@ public class WorldRenderer this.glRenderList = par6; this.setPosition(par3, par4, par5); this.needsUpdate = false; + System.out.println("WorldRenderer.WorldRenderer()"); } /** @@ -125,9 +128,11 @@ public class WorldRenderer /** * Will update this chunk renderer + * @param async */ - public void updateRenderer() + public void updateRenderer(boolean async) { + if(this.worldObj == null) return; if (this.needsUpdate) { this.needsUpdate = false; @@ -161,6 +166,8 @@ public class WorldRenderer boolean var12 = false; boolean var13 = false; boolean var14 = false; + Tessellator tessellator = async ? tessellators[var11] : Tessellator.instance; + var10.setTessellator(tessellator); // NOTE: YZX -> ZXY for (BigInteger var16 = var3; var16.compareTo(var6) < 0; var16 = var16.add(BigInteger.ONE)) @@ -176,13 +183,6 @@ public class WorldRenderer if (!var14) { var14 = true; - GL11.glNewList(this.glRenderList + var11, GL11.GL_COMPILE); - GL11.glPushMatrix(); - this.setupGLTranslation(); - float var19 = 1.000001F; - GL11.glTranslatef(-8.0F, -8.0F, -8.0F); - GL11.glScalef(var19, var19, var19); - GL11.glTranslatef(8.0F, 8.0F, 8.0F); tessellator.startDrawingQuads(); tessellator.setTranslation((double)(-this.posX.doubleValue()), (double)(-this.posY), (double)(-this.posZ.doubleValue())); } @@ -219,9 +219,10 @@ public class WorldRenderer if (var14) { - this.bytesDrawn += tessellator.draw(); - GL11.glPopMatrix(); - GL11.glEndList(); + if(!async) { + compile(var11, false); + } + isCompiled = !async; tessellator.setTranslation(0.0D, 0.0D, 0.0D); } else @@ -252,7 +253,26 @@ public class WorldRenderer } } - /** + void compile(int pass, boolean async) { + GL11.glNewList(this.glRenderList + pass, GL11.GL_COMPILE); + GL11.glPushMatrix(); + this.setupGLTranslation(); + float var19 = 1.000001F; + GL11.glTranslatef(-8.0F, -8.0F, -8.0F); + GL11.glScalef(var19, var19, var19); + GL11.glTranslatef(8.0F, 8.0F, 8.0F); + this.bytesDrawn += (async ? tessellators[pass] : Tessellator.instance).draw(); +// System.out.println(this.bytesDrawn); + GL11.glPopMatrix(); + GL11.glEndList(); + } + + public void compileAllLayers() { + for(int i = 0; i < 2; i++) if(tessellators[i].isDrawing()) compile(i, true); + isCompiled = true; + } + + /** * Returns the distance of this chunk renderer to the entity without performing the final normalizing square root, * for performance reasons. */