From 38a8423428cc53a4600678b7c8b0497ebe5b597e Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Mon, 2 Sep 2024 16:33:39 +0200 Subject: [PATCH] Make the BlockStateModelFactory a thread-local and reuse it during rendering --- .../bluemap/core/map/hires/HiresModelRenderer.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java index d272b399c..8f9de6e07 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java @@ -31,19 +31,21 @@ import de.bluecolored.bluemap.core.resources.pack.resourcepack.ResourcePack; import de.bluecolored.bluemap.core.util.math.Color; import de.bluecolored.bluemap.core.world.Chunk; -import de.bluecolored.bluemap.core.world.block.BlockNeighborhood; import de.bluecolored.bluemap.core.world.World; +import de.bluecolored.bluemap.core.world.block.BlockNeighborhood; public class HiresModelRenderer { private final ResourcePack resourcePack; - private final TextureGallery textureGallery; private final RenderSettings renderSettings; + private final ThreadLocal threadLocalModelFactory; + public HiresModelRenderer(ResourcePack resourcePack, TextureGallery textureGallery, RenderSettings renderSettings) { this.resourcePack = resourcePack; - this.textureGallery = textureGallery; this.renderSettings = renderSettings; + + this.threadLocalModelFactory = ThreadLocal.withInitial(() -> new BlockStateModelFactory(resourcePack, textureGallery, renderSettings)); } public void render(World world, Vector3i modelMin, Vector3i modelMax, TileModel model) { @@ -55,8 +57,7 @@ public void render(World world, Vector3i modelMin, Vector3i modelMax, TileModel Vector3i max = modelMax.min(renderSettings.getMaxPos()); Vector3i modelAnchor = new Vector3i(modelMin.getX(), 0, modelMin.getZ()); - // create new for each tile-render since the factory is not threadsafe - BlockStateModelFactory modelFactory = new BlockStateModelFactory(resourcePack, textureGallery, renderSettings); + BlockStateModelFactory modelFactory = threadLocalModelFactory.get(); int maxHeight, minY, maxY; double topBlockLight;