mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2025-07-03 08:25:31 +00:00
configurable cache sizes
This commit is contained in:
parent
244f0fba11
commit
8fd3530653
@ -6,6 +6,7 @@ import com.dfsek.terra.api.math.ProbabilityCollection;
|
|||||||
import com.dfsek.terra.api.math.Range;
|
import com.dfsek.terra.api.math.Range;
|
||||||
import com.dfsek.terra.api.math.noise.samplers.Normalizer;
|
import com.dfsek.terra.api.math.noise.samplers.Normalizer;
|
||||||
import com.dfsek.terra.api.platform.TerraPlugin;
|
import com.dfsek.terra.api.platform.TerraPlugin;
|
||||||
|
import com.dfsek.terra.biome.BiomeProvider;
|
||||||
import com.dfsek.terra.biome.palette.PaletteHolder;
|
import com.dfsek.terra.biome.palette.PaletteHolder;
|
||||||
import com.dfsek.terra.biome.palette.PaletteLayer;
|
import com.dfsek.terra.biome.palette.PaletteLayer;
|
||||||
import com.dfsek.terra.carving.CarverPalette;
|
import com.dfsek.terra.carving.CarverPalette;
|
||||||
@ -18,6 +19,7 @@ import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader;
|
|||||||
import com.dfsek.terra.config.loaders.config.OreConfigLoader;
|
import com.dfsek.terra.config.loaders.config.OreConfigLoader;
|
||||||
import com.dfsek.terra.config.loaders.config.OreHolderLoader;
|
import com.dfsek.terra.config.loaders.config.OreHolderLoader;
|
||||||
import com.dfsek.terra.config.loaders.config.TreeLayerLoader;
|
import com.dfsek.terra.config.loaders.config.TreeLayerLoader;
|
||||||
|
import com.dfsek.terra.config.loaders.config.biome.BiomeProviderBuilderLoader;
|
||||||
import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader;
|
import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader;
|
||||||
import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader;
|
import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader;
|
||||||
import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader;
|
import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader;
|
||||||
@ -53,6 +55,7 @@ public class GenericLoaders implements LoaderRegistrar {
|
|||||||
.registerLoader(MaterialSet.class, new MaterialSetLoader())
|
.registerLoader(MaterialSet.class, new MaterialSetLoader())
|
||||||
.registerLoader(OreHolder.class, new OreHolderLoader())
|
.registerLoader(OreHolder.class, new OreHolderLoader())
|
||||||
.registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf(o.toString()))
|
.registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf(o.toString()))
|
||||||
.registerLoader(Normalizer.NormalType.class, (t, o, l) -> Normalizer.NormalType.valueOf(o.toString().toUpperCase()));
|
.registerLoader(Normalizer.NormalType.class, (t, o, l) -> Normalizer.NormalType.valueOf(o.toString().toUpperCase()))
|
||||||
|
.registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(main));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,7 @@ package com.dfsek.terra.biome;
|
|||||||
|
|
||||||
import com.dfsek.tectonic.exception.ConfigException;
|
import com.dfsek.tectonic.exception.ConfigException;
|
||||||
import com.dfsek.terra.api.math.vector.Vector2;
|
import com.dfsek.terra.api.math.vector.Vector2;
|
||||||
|
import com.dfsek.terra.api.platform.TerraPlugin;
|
||||||
import com.dfsek.terra.api.world.biome.TerraBiome;
|
import com.dfsek.terra.api.world.biome.TerraBiome;
|
||||||
import com.dfsek.terra.biome.pipeline.BiomeHolder;
|
import com.dfsek.terra.biome.pipeline.BiomeHolder;
|
||||||
import com.dfsek.terra.biome.pipeline.BiomePipeline;
|
import com.dfsek.terra.biome.pipeline.BiomePipeline;
|
||||||
@ -14,37 +15,37 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
public class StandardBiomeProvider implements BiomeProvider {
|
public class StandardBiomeProvider implements BiomeProvider {
|
||||||
private final BiomePipeline pipeline;
|
private final LoadingCache<Vector2, BiomeHolder> holderCache;
|
||||||
private final LoadingCache<Vector2, BiomeHolder> holderCache = CacheBuilder.newBuilder()
|
private final LoadingCache<Vector2, TerraBiome> biomeCache;
|
||||||
.maximumSize(64)
|
|
||||||
.build(
|
|
||||||
new CacheLoader<Vector2, BiomeHolder>() {
|
|
||||||
@Override
|
|
||||||
public BiomeHolder load(@NotNull Vector2 key) {
|
|
||||||
return pipeline.getBiomes(key.getBlockX(), key.getBlockZ());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
private final LoadingCache<Vector2, TerraBiome> biomeCache = CacheBuilder.newBuilder()
|
|
||||||
.maximumSize(1024)
|
|
||||||
.build(
|
|
||||||
new CacheLoader<Vector2, TerraBiome>() {
|
|
||||||
@Override
|
|
||||||
public TerraBiome load(@NotNull Vector2 key) throws ExecutionException {
|
|
||||||
int x = FastMath.floorToInt(key.getX());
|
|
||||||
int z = FastMath.floorToInt(key.getZ());
|
|
||||||
x /= resolution;
|
|
||||||
z /= resolution;
|
|
||||||
int fdX = FastMath.floorDiv(x, pipeline.getSize());
|
|
||||||
int fdZ = FastMath.floorDiv(z, pipeline.getSize());
|
|
||||||
return holderCache.get(new Vector2(fdX, fdZ)).getBiome(x - fdX * pipeline.getSize(), z - fdZ * pipeline.getSize());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
private int resolution = 1;
|
private int resolution = 1;
|
||||||
|
|
||||||
protected StandardBiomeProvider(BiomePipeline pipeline) {
|
protected StandardBiomeProvider(BiomePipeline pipeline, TerraPlugin main) {
|
||||||
this.pipeline = pipeline;
|
holderCache = CacheBuilder.newBuilder()
|
||||||
|
.maximumSize(main == null ? 32 : main.getTerraConfig().getProviderCache())
|
||||||
|
.build(
|
||||||
|
new CacheLoader<Vector2, BiomeHolder>() {
|
||||||
|
@Override
|
||||||
|
public BiomeHolder load(@NotNull Vector2 key) {
|
||||||
|
return pipeline.getBiomes(key.getBlockX(), key.getBlockZ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
biomeCache = CacheBuilder.newBuilder()
|
||||||
|
.maximumSize(main == null ? 512 : main.getTerraConfig().getBiomeCache())
|
||||||
|
.build(
|
||||||
|
new CacheLoader<Vector2, TerraBiome>() {
|
||||||
|
@Override
|
||||||
|
public TerraBiome load(@NotNull Vector2 key) throws ExecutionException {
|
||||||
|
int x = FastMath.floorToInt(key.getX());
|
||||||
|
int z = FastMath.floorToInt(key.getZ());
|
||||||
|
x /= resolution;
|
||||||
|
z /= resolution;
|
||||||
|
int fdX = FastMath.floorDiv(x, pipeline.getSize());
|
||||||
|
int fdZ = FastMath.floorDiv(z, pipeline.getSize());
|
||||||
|
return holderCache.get(new Vector2(fdX, fdZ)).getBiome(x - fdX * pipeline.getSize(), z - fdZ * pipeline.getSize());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -70,15 +71,17 @@ public class StandardBiomeProvider implements BiomeProvider {
|
|||||||
|
|
||||||
public static final class StandardBiomeProviderBuilder implements BiomeProviderBuilder {
|
public static final class StandardBiomeProviderBuilder implements BiomeProviderBuilder {
|
||||||
private final ExceptionalFunction<Long, BiomePipeline> pipelineBuilder;
|
private final ExceptionalFunction<Long, BiomePipeline> pipelineBuilder;
|
||||||
|
private final TerraPlugin main;
|
||||||
|
|
||||||
public StandardBiomeProviderBuilder(ExceptionalFunction<Long, BiomePipeline> pipelineBuilder) {
|
public StandardBiomeProviderBuilder(ExceptionalFunction<Long, BiomePipeline> pipelineBuilder, TerraPlugin main) {
|
||||||
this.pipelineBuilder = pipelineBuilder;
|
this.pipelineBuilder = pipelineBuilder;
|
||||||
|
this.main = main;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public StandardBiomeProvider build(long seed) {
|
public StandardBiomeProvider build(long seed) {
|
||||||
try {
|
try {
|
||||||
return new StandardBiomeProvider(pipelineBuilder.apply(seed));
|
return new StandardBiomeProvider(pipelineBuilder.apply(seed), main);
|
||||||
} catch(ConfigException e) {
|
} catch(ConfigException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,6 @@ import com.dfsek.terra.api.world.biome.TerraBiome;
|
|||||||
import com.dfsek.terra.api.world.flora.Flora;
|
import com.dfsek.terra.api.world.flora.Flora;
|
||||||
import com.dfsek.terra.api.world.palette.Palette;
|
import com.dfsek.terra.api.world.palette.Palette;
|
||||||
import com.dfsek.terra.api.world.tree.Tree;
|
import com.dfsek.terra.api.world.tree.Tree;
|
||||||
import com.dfsek.terra.biome.BiomeProvider;
|
|
||||||
import com.dfsek.terra.biome.UserDefinedBiome;
|
import com.dfsek.terra.biome.UserDefinedBiome;
|
||||||
import com.dfsek.terra.carving.UserDefinedCarver;
|
import com.dfsek.terra.carving.UserDefinedCarver;
|
||||||
import com.dfsek.terra.config.exception.FileMissingException;
|
import com.dfsek.terra.config.exception.FileMissingException;
|
||||||
@ -29,7 +28,6 @@ import com.dfsek.terra.config.files.FolderLoader;
|
|||||||
import com.dfsek.terra.config.files.Loader;
|
import com.dfsek.terra.config.files.Loader;
|
||||||
import com.dfsek.terra.config.files.ZIPLoader;
|
import com.dfsek.terra.config.files.ZIPLoader;
|
||||||
import com.dfsek.terra.config.lang.LangUtil;
|
import com.dfsek.terra.config.lang.LangUtil;
|
||||||
import com.dfsek.terra.config.loaders.config.biome.BiomeProviderBuilderLoader;
|
|
||||||
import com.dfsek.terra.config.templates.AbstractableTemplate;
|
import com.dfsek.terra.config.templates.AbstractableTemplate;
|
||||||
import com.dfsek.terra.config.templates.BiomeTemplate;
|
import com.dfsek.terra.config.templates.BiomeTemplate;
|
||||||
import com.dfsek.terra.config.templates.CarverTemplate;
|
import com.dfsek.terra.config.templates.CarverTemplate;
|
||||||
@ -258,8 +256,7 @@ public class ConfigPack implements LoaderRegistrar {
|
|||||||
.registerLoader(Tree.class, treeRegistry)
|
.registerLoader(Tree.class, treeRegistry)
|
||||||
.registerLoader(StructureScript.class, scriptRegistry)
|
.registerLoader(StructureScript.class, scriptRegistry)
|
||||||
.registerLoader(TerraStructure.class, structureRegistry)
|
.registerLoader(TerraStructure.class, structureRegistry)
|
||||||
.registerLoader(LootTable.class, lootRegistry)
|
.registerLoader(LootTable.class, lootRegistry);
|
||||||
.registerLoader(BiomeProvider.BiomeProviderBuilder.class, new BiomeProviderBuilderLoader(this));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ScriptRegistry getScriptRegistry() {
|
public ScriptRegistry getScriptRegistry() {
|
||||||
|
@ -37,15 +37,23 @@ public class PluginConfig implements ConfigTemplate {
|
|||||||
|
|
||||||
@Value("cache.carver")
|
@Value("cache.carver")
|
||||||
@Default
|
@Default
|
||||||
private int carverCache = 512;
|
private int carverCache = 256;
|
||||||
|
|
||||||
@Value("cache.structure")
|
@Value("cache.structure")
|
||||||
@Default
|
@Default
|
||||||
private int structureCache = 128;
|
private int structureCache = 32;
|
||||||
|
|
||||||
@Value("cache.sampler")
|
@Value("cache.sampler")
|
||||||
@Default
|
@Default
|
||||||
private int samplerCache = 512;
|
private int samplerCache = 64;
|
||||||
|
|
||||||
|
@Value("cache.biome")
|
||||||
|
@Default
|
||||||
|
private int biomeCache = 512;
|
||||||
|
|
||||||
|
@Value("cache.biome-provider")
|
||||||
|
@Default
|
||||||
|
private int providerCache = 32;
|
||||||
|
|
||||||
@Value("dump-default")
|
@Value("dump-default")
|
||||||
@Default
|
@Default
|
||||||
@ -107,4 +115,12 @@ public class PluginConfig implements ConfigTemplate {
|
|||||||
public int getMaxRecursion() {
|
public int getMaxRecursion() {
|
||||||
return maxRecursion;
|
return maxRecursion;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getBiomeCache() {
|
||||||
|
return biomeCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getProviderCache() {
|
||||||
|
return providerCache;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,8 +4,8 @@ import com.dfsek.tectonic.exception.LoadException;
|
|||||||
import com.dfsek.tectonic.loading.ConfigLoader;
|
import com.dfsek.tectonic.loading.ConfigLoader;
|
||||||
import com.dfsek.tectonic.loading.TypeLoader;
|
import com.dfsek.tectonic.loading.TypeLoader;
|
||||||
import com.dfsek.terra.api.math.ProbabilityCollection;
|
import com.dfsek.terra.api.math.ProbabilityCollection;
|
||||||
import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite;
|
|
||||||
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
|
import com.dfsek.terra.api.math.noise.samplers.NoiseSampler;
|
||||||
|
import com.dfsek.terra.api.platform.TerraPlugin;
|
||||||
import com.dfsek.terra.api.world.biome.TerraBiome;
|
import com.dfsek.terra.api.world.biome.TerraBiome;
|
||||||
import com.dfsek.terra.biome.BiomeProvider;
|
import com.dfsek.terra.biome.BiomeProvider;
|
||||||
import com.dfsek.terra.biome.StandardBiomeProvider;
|
import com.dfsek.terra.biome.StandardBiomeProvider;
|
||||||
@ -17,9 +17,9 @@ import com.dfsek.terra.biome.pipeline.mutator.SmoothMutator;
|
|||||||
import com.dfsek.terra.biome.pipeline.source.RandomSource;
|
import com.dfsek.terra.biome.pipeline.source.RandomSource;
|
||||||
import com.dfsek.terra.biome.pipeline.stages.ExpanderStage;
|
import com.dfsek.terra.biome.pipeline.stages.ExpanderStage;
|
||||||
import com.dfsek.terra.biome.pipeline.stages.MutatorStage;
|
import com.dfsek.terra.biome.pipeline.stages.MutatorStage;
|
||||||
import com.dfsek.terra.config.base.ConfigPack;
|
|
||||||
import com.dfsek.terra.config.loaders.Types;
|
import com.dfsek.terra.config.loaders.Types;
|
||||||
import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader;
|
import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader;
|
||||||
|
import com.dfsek.terra.debug.Debug;
|
||||||
import com.dfsek.terra.generation.config.NoiseBuilder;
|
import com.dfsek.terra.generation.config.NoiseBuilder;
|
||||||
import net.jafama.FastMath;
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
@ -29,16 +29,10 @@ import java.util.Map;
|
|||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public class BiomeProviderBuilderLoader implements TypeLoader<BiomeProvider.BiomeProviderBuilder> {
|
public class BiomeProviderBuilderLoader implements TypeLoader<BiomeProvider.BiomeProviderBuilder> {
|
||||||
private final ConfigPack pack;
|
private final TerraPlugin main;
|
||||||
|
|
||||||
public BiomeProviderBuilderLoader(ConfigPack pack) {
|
public BiomeProviderBuilderLoader(TerraPlugin main) {
|
||||||
this.pack = pack;
|
this.main = main;
|
||||||
}
|
|
||||||
|
|
||||||
private static NoiseSampler whiteNoise(int seed) {
|
|
||||||
FastNoiseLite noiseLite = new FastNoiseLite(seed);
|
|
||||||
noiseLite.setNoiseType(FastNoiseLite.NoiseType.WhiteNoise);
|
|
||||||
return noiseLite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -52,6 +46,7 @@ public class BiomeProviderBuilderLoader implements TypeLoader<BiomeProvider.Biom
|
|||||||
|
|
||||||
List<Map<String, Object>> stages = (List<Map<String, Object>>) map.get("pipeline");
|
List<Map<String, Object>> stages = (List<Map<String, Object>>) map.get("pipeline");
|
||||||
BiomePipeline.BiomePipelineBuilder pipelineBuilder = new BiomePipeline.BiomePipelineBuilder(2);
|
BiomePipeline.BiomePipelineBuilder pipelineBuilder = new BiomePipeline.BiomePipelineBuilder(2);
|
||||||
|
|
||||||
for(Map<String, Object> stage : stages) {
|
for(Map<String, Object> stage : stages) {
|
||||||
for(Map.Entry<String, Object> entry : stage.entrySet()) {
|
for(Map.Entry<String, Object> entry : stage.entrySet()) {
|
||||||
Map<String, Object> mutator = (Map<String, Object>) entry.getValue();
|
Map<String, Object> mutator = (Map<String, Object>) entry.getValue();
|
||||||
@ -77,7 +72,9 @@ public class BiomeProviderBuilderLoader implements TypeLoader<BiomeProvider.Biom
|
|||||||
} else throw new LoadException("No such mutator \"" + entry.getKey() + "\"");
|
} else throw new LoadException("No such mutator \"" + entry.getKey() + "\"");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return pipelineBuilder.build(new RandomSource(sourceBiomes, sourceNoise));
|
BiomePipeline pipeline = pipelineBuilder.build(new RandomSource(sourceBiomes, sourceNoise));
|
||||||
});
|
Debug.info("Biome Pipeline scale factor: " + pipeline.getSize());
|
||||||
|
return pipeline;
|
||||||
|
}, main);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -79,7 +79,7 @@ public class BiomeTest {
|
|||||||
.build(source);
|
.build(source);
|
||||||
System.out.println("Size: " + pipeline.getSize());
|
System.out.println("Size: " + pipeline.getSize());
|
||||||
return pipeline;
|
return pipeline;
|
||||||
}).build(0);
|
}, null).build(0);
|
||||||
|
|
||||||
|
|
||||||
int size = 1000;
|
int size = 1000;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user