From fb480c2695a5de90fe1b0a4e8562f4daec8a79ca Mon Sep 17 00:00:00 2001 From: Leonardo Date: Wed, 22 Sep 2021 13:17:56 +0200 Subject: [PATCH] fix to memory use --- .../seibel/lod/builders/LodBufferBuilder.java | 42 +++++++++++-------- .../lod/handlers/LodDimensionFileHandler.java | 2 +- .../com/seibel/lod/objects/LodDimension.java | 25 +++++++++-- .../com/seibel/lod/proxy/ClientProxy.java | 2 +- .../com/seibel/lod/render/LodRenderer.java | 4 +- 5 files changed, 49 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index fe3e03d81..e3d04f478 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -28,7 +28,6 @@ import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.locks.ReentrantLock; -import com.seibel.lod.render.RenderUtil; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL15; import org.lwjgl.opengl.GL15C; @@ -129,7 +128,7 @@ public class LodBufferBuilder */ private volatile ChunkPos drawableCenterChunkPos = new ChunkPos(0, 0); private volatile ChunkPos buildableCenterChunkPos = new ChunkPos(0, 0); - + private volatile boolean firstSetup = true; public LodBufferBuilder() { @@ -175,6 +174,7 @@ public class LodBufferBuilder ArrayList> nodeToRenderThreads = new ArrayList<>(lodDim.getWidth() * lodDim.getWidth()); + //setupBuffers(lodDim); startBuffers(fullRegen, lodDim); // =====================// @@ -204,7 +204,7 @@ public class LodBufferBuilder { for (int zRegion = 0; zRegion < lodDim.getWidth(); zRegion++) { - if (lodDim.getRegenByArrayIndex(xRegion, zRegion) || fullRegen) + if (lodDim.isRegionToRegen(xRegion, zRegion) || fullRegen) { RegionPos regionPos = new RegionPos( xRegion + lodDim.getCenterX() - Math.floorDiv(lodDim.getWidth(), 2), @@ -219,7 +219,7 @@ public class LodBufferBuilder // make sure the buffers weren't // changed while we were running this method - if (currentBuffer == null || (currentBuffer != null && !currentBuffer.building())) + if (currentBuffer == null || !currentBuffer.building()) return; byte minDetail = region.getMinDetailLevel(); @@ -403,27 +403,33 @@ public class LodBufferBuilder *

* May have to wait for the bufferLock to open. */ - public void setupBuffers(int numbRegionsWide, LodDimension lodDimension) + public void setupBuffers(LodDimension lodDimension) { bufferLock.lock(); - - previousRegionWidth = numbRegionsWide; + int numbRegionsWide = lodDimension.getWidth(); int bufferMaxCapacity; - buildableBuffers = new BufferBuilder[numbRegionsWide][numbRegionsWide]; - - buildableVbos = new VertexBuffer[numbRegionsWide][numbRegionsWide]; - drawableVbos = new VertexBuffer[numbRegionsWide][numbRegionsWide]; + //if(previousRegionWidth != numbRegionsWide || firstSetup) + //{ + firstSetup = false; + previousRegionWidth = numbRegionsWide; + buildableBuffers = new BufferBuilder[numbRegionsWide][numbRegionsWide]; + buildableVbos = new VertexBuffer[numbRegionsWide][numbRegionsWide]; + drawableVbos = new VertexBuffer[numbRegionsWide][numbRegionsWide]; + //} for (int x = 0; x < numbRegionsWide; x++) { for (int z = 0; z < numbRegionsWide; z++) { - bufferMaxCapacity = lodDimension.getMemoryRequired(x,z); - buildableBuffers[x][z] = new BufferBuilder(bufferMaxCapacity); + //if(lodDimension.isBufferToSetup(x,z)) + //{ + bufferMaxCapacity = lodDimension.getMemoryRequired(x, z, LodConfig.CLIENT.graphics.lodTemplate.get()); + buildableBuffers[x][z] = new BufferBuilder(bufferMaxCapacity); - buildableVbos[x][z] = new VertexBuffer(LodRenderer.LOD_VERTEX_FORMAT); - drawableVbos[x][z] = new VertexBuffer(LodRenderer.LOD_VERTEX_FORMAT); + buildableVbos[x][z] = new VertexBuffer(LodRenderer.LOD_VERTEX_FORMAT); + drawableVbos[x][z] = new VertexBuffer(LodRenderer.LOD_VERTEX_FORMAT); + //} } } @@ -455,7 +461,7 @@ public class LodBufferBuilder { for (int z = 0; z < buildableBuffers.length; z++) { - if (fullRegen || lodDim.getRegenByArrayIndex(x, z)) + if (fullRegen || lodDim.isRegionToRegen(x, z)) { buildableBuffers[x][z].begin(GL11.GL_QUADS, LodRenderer.LOD_VERTEX_FORMAT); } @@ -470,7 +476,7 @@ public class LodBufferBuilder { for (int x = 0; x < buildableBuffers.length; x++) for (int z = 0; z < buildableBuffers.length; z++) - if (buildableBuffers[x][z] != null && buildableBuffers[x][z].building() && (fullRegen || lodDim.getRegenByArrayIndex(x, z))) + if (buildableBuffers[x][z] != null && buildableBuffers[x][z].building() && (fullRegen || lodDim.isRegionToRegen(x, z))) buildableBuffers[x][z].end(); } @@ -491,7 +497,7 @@ public class LodBufferBuilder { for (int z = 0; z < buildableVbos.length; z++) { - if (fullRegen || lodDim.getRegenByArrayIndex(x, z)) + if (fullRegen || lodDim.isRegionToRegen(x, z)) { ByteBuffer builderBuffer = buildableBuffers[x][z].popNextBuffer().getSecond(); vboUpload(buildableVbos[x][z], builderBuffer); diff --git a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java index 2fc254db0..bdb7beb41 100644 --- a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java @@ -219,7 +219,7 @@ public class LodDimensionFileHandler { for (int j = 0; j < loadedDimension.getWidth(); j++) { - if (loadedDimension.getRegenByArrayIndex(i,j) && loadedDimension.getRegionByArrayIndex(i,j) != null) + if (loadedDimension.isRegionToRegen(i,j) && loadedDimension.getRegionByArrayIndex(i,j) != null) { saveRegionToFile(loadedDimension.getRegionByArrayIndex(i,j)); loadedDimension.setRegenByArrayIndex(i, j,false); diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index bc4cffe2c..1eba4da93 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -25,6 +25,7 @@ import java.util.concurrent.Executors; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.enums.GenerationPriority; +import com.seibel.lod.enums.LodTemplate; import com.seibel.lod.enums.VerticalQuality; import com.seibel.lod.handlers.LodDimensionFileHandler; import com.seibel.lod.util.DataPointUtil; @@ -68,6 +69,7 @@ public class LodDimension * stores all the regions in this dimension */ public volatile LodRegion[][] regions; + /** * stores if the region at the given x and z index needs to be saved to disk */ @@ -76,6 +78,10 @@ public class LodDimension * stores if the region at the given x and z index needs to be regenerated */ private volatile boolean[][] regionNeedsRegen; + /** + * stores if the buffer size at the given x and z index needs to be changed + */ + private volatile boolean[][] setupBuffer; /** * if true that means there are regions in this dimension @@ -138,6 +144,7 @@ public class LodDimension regions = new LodRegion[width][width]; isRegionDirty = new boolean[width][width]; regionNeedsRegen = new boolean[width][width]; + setupBuffer = new boolean[width][width]; //treeGenerator((int) mc.player.getX(),(int) mc.player.getZ()); @@ -380,6 +387,7 @@ public class LodDimension if (regions[x][z].getMinDetailLevel() > levelToCut) { regions[x][z].cutTree(levelToCut); + setupBuffer[x][z] = true; } } @@ -440,12 +448,14 @@ public class LodDimension } regionNeedsRegen[x][z] = true; regenDimension = true; + setupBuffer[x][z] = true; } else if (region.getMinDetailLevel() > levelToGen) { //Second case, region has been initialized but at a higher level //We expand the region by introducing the missing layer region.expand(levelToGen); + setupBuffer[x][z] = true; } } } @@ -686,10 +696,14 @@ public class LodDimension region.clear(detailLevel, posX, posZ); } - public boolean getRegenByArrayIndex(int xIndex, int zIndex) + public boolean isRegionToRegen(int xIndex, int zIndex) { return regionNeedsRegen[xIndex][zIndex]; } + public boolean isBufferToSetup(int xIndex, int zIndex) + { + return setupBuffer[xIndex][zIndex]; + } public void setRegenByArrayIndex(int xIndex, int zIndex, boolean newRegen) { @@ -804,6 +818,7 @@ public class LodDimension regions = new LodRegion[width][width]; isRegionDirty = new boolean[width][width]; regionNeedsRegen = new boolean[width][width]; + setupBuffer = new boolean[width][width]; // populate isRegionDirty for (int i = 0; i < width; i++) @@ -840,11 +855,13 @@ public class LodDimension return stringBuilder.toString(); } - public int getMemoryRequired(int x, int z) + public int getMemoryRequired(int x, int z, LodTemplate template) { + /*return regions[x][z].getMinMemoryNeeded(template);*/ + int minDistance = LevelPosUtil.minDistance(LodUtil.REGION_DETAIL_LEVEL, x, z, halfWidth, halfWidth); - int detail = DetailDistanceUtil.getGenerationDetailFromDistance(minDistance); - int levelToGen = DetailDistanceUtil.getLodGenDetail(detail).detailLevel; + int detail = DetailDistanceUtil.getTreeCutDetailFromDistance(minDistance); + int levelToGen = DetailDistanceUtil.getCutLodDetail(detail); int size = 1 << (LodUtil.REGION_DETAIL_LEVEL - levelToGen); int maxVerticalData = DetailDistanceUtil.getMaxVerticalData(levelToGen); int numberOfLods = size * size * maxVerticalData; diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index e644f0fa7..ac8de0fc6 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -339,7 +339,7 @@ public class ClientProxy // update the dimensions to fit the new width lodWorld.resizeDimensionRegionWidth(newWidth); lodBuilder.defaultDimensionWidthInRegions = newWidth; - renderer.setupBuffers(newWidth, lodWorld.getLodDimension(mc.getClientWorld().dimensionType())); + renderer.setupBuffers(lodWorld.getLodDimension(mc.getClientWorld().dimensionType())); recalculateWidths = false; //LOGGER.info("new dimension width in regions: " + newWidth + "\t potential: " + newWidth ); diff --git a/src/main/java/com/seibel/lod/render/LodRenderer.java b/src/main/java/com/seibel/lod/render/LodRenderer.java index d4bd5bb5e..a7e353cbb 100644 --- a/src/main/java/com/seibel/lod/render/LodRenderer.java +++ b/src/main/java/com/seibel/lod/render/LodRenderer.java @@ -589,7 +589,7 @@ public class LodRenderer /** * Create all buffers that will be used. */ - public void setupBuffers(int numbRegionsWide, LodDimension lodDim) + public void setupBuffers(LodDimension lodDim) { // calculate the max amount of memory needed (in bytes) /*int bufferMemory = RenderUtil.getBufferMemoryForRegion(lodDim);*/ @@ -603,7 +603,7 @@ public class LodRenderer + " It tried to allocate \"" + bufferMemory + "\" bytes, when \"" + MAX_ALOCATEABLE_DIRECT_MEMORY + "\" is the max."); }*/ - lodBufferBuilder.setupBuffers(numbRegionsWide, lodDim); + lodBufferBuilder.setupBuffers(lodDim); }