diff options
author | makamys <makamys@outlook.com> | 2022-06-21 04:46:43 +0200 |
---|---|---|
committer | makamys <makamys@outlook.com> | 2022-06-21 06:09:26 +0200 |
commit | d6b0f3f9978799b26a3ebca1a91ebc110a6b894a (patch) | |
tree | a4f7f2124f98c0bbe6b0797228b14d99f32bf1c8 /src/main/java/makamys/neodymium/renderer | |
parent | 6f22d15c8532ee5e5d81a383363a6148e9449ebb (diff) | |
download | Neodymium-d6b0f3f9978799b26a3ebca1a91ebc110a6b894a.tar.gz Neodymium-d6b0f3f9978799b26a3ebca1a91ebc110a6b894a.tar.bz2 Neodymium-d6b0f3f9978799b26a3ebca1a91ebc110a6b894a.zip |
Recycle MeshQuad objects
Reduces client thread's RAM allocation rate from ~80 MB/s to ~20 MB/s.
Diffstat (limited to 'src/main/java/makamys/neodymium/renderer')
-rw-r--r-- | src/main/java/makamys/neodymium/renderer/ChunkMesh.java | 10 | ||||
-rw-r--r-- | src/main/java/makamys/neodymium/renderer/MeshQuad.java | 34 |
2 files changed, 40 insertions, 4 deletions
diff --git a/src/main/java/makamys/neodymium/renderer/ChunkMesh.java b/src/main/java/makamys/neodymium/renderer/ChunkMesh.java index abe9a2d..ff6e6ba 100644 --- a/src/main/java/makamys/neodymium/renderer/ChunkMesh.java +++ b/src/main/java/makamys/neodymium/renderer/ChunkMesh.java @@ -19,6 +19,7 @@ import makamys.neodymium.MixinConfigPlugin; import makamys.neodymium.Neodymium; import makamys.neodymium.ducks.IWorldRenderer; import makamys.neodymium.util.BufferWriter; +import makamys.neodymium.util.RecyclingList; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.WorldRenderer; @@ -40,6 +41,8 @@ public class ChunkMesh extends Mesh { public static int usedRAM = 0; public static int instances = 0; + private static RecyclingList<MeshQuad> quadBuf = new RecyclingList<>(() -> new MeshQuad()); + public ChunkMesh(int x, int y, int z, Flags flags, int quadCount, ByteBuffer buffer, int pass) { this.x = x; this.y = y; @@ -86,13 +89,14 @@ public class ChunkMesh extends Mesh { ChunkMesh.Flags flags = new ChunkMesh.Flags(t.hasTexture, t.hasBrightness, t.hasColor, t.hasNormals); - List<MeshQuad> quads = new ArrayList<>(); + quadBuf.reset(); for(int quadI = 0; quadI < t.vertexCount / 4; quadI++) { - MeshQuad quad = new MeshQuad(t.rawBuffer, quadI * 32, flags, tessellatorXOffset, tessellatorYOffset, tessellatorZOffset); - quads.add(quad); + quadBuf.next().setState(t.rawBuffer, quadI * 32, flags, tessellatorXOffset, tessellatorYOffset, tessellatorZOffset); } + List<MeshQuad> quads = quadBuf.getAsList(); + if(Config.simplifyChunkMeshes) { ArrayList<ArrayList<MeshQuad>> quadsByPlaneDir = new ArrayList<>(); // XY, XZ, YZ for(int i = 0; i < 3; i++) { diff --git a/src/main/java/makamys/neodymium/renderer/MeshQuad.java b/src/main/java/makamys/neodymium/renderer/MeshQuad.java index 2024efd..1ff4173 100644 --- a/src/main/java/makamys/neodymium/renderer/MeshQuad.java +++ b/src/main/java/makamys/neodymium/renderer/MeshQuad.java @@ -96,7 +96,9 @@ public class MeshQuad { } } - public MeshQuad(int[] rawBuffer, int offset, ChunkMesh.Flags flags, int offsetX, int offsetY, int offsetZ) { + public void setState(int[] rawBuffer, int offset, ChunkMesh.Flags flags, int offsetX, int offsetY, int offsetZ) { + resetState(); + read(rawBuffer, offset, offsetX, offsetY, offsetZ); uDirectionIs01 = us[0] != us[1]; @@ -110,6 +112,36 @@ public class MeshQuad { normal = QuadNormal.fromVector(vectorC); } + private void resetState() { + Arrays.fill(xs, 0); + Arrays.fill(ys, 0); + Arrays.fill(zs, 0); + Arrays.fill(us, 0); + Arrays.fill(vs, 0); + Arrays.fill(bs, 0); + Arrays.fill(cs, 0); + + minX = Float.POSITIVE_INFINITY; + minY = Float.POSITIVE_INFINITY; + minZ = Float.POSITIVE_INFINITY; + maxX = Float.NEGATIVE_INFINITY; + maxY = Float.NEGATIVE_INFINITY; + maxZ = Float.NEGATIVE_INFINITY; + + deleted = noMerge = false; + normal = null; + offset = 0; + flags = null; + uDirectionIs01 = false; + Arrays.fill(quadCountByDirection, 1); + Arrays.fill(totalMergeCountByPlane, 0); + mergeReference = null; + } + + public MeshQuad() { + + } + public void writeToBuffer(BufferWriter out) throws IOException { for(int vertexI = 0; vertexI < 4; vertexI++) { int vi = vertexI; |