mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-03 08:26:11 +00:00
Parallax Feature Performance Caching
This commit is contained in:
parent
1496d0e482
commit
df9114d7b0
@ -18,8 +18,13 @@
|
|||||||
|
|
||||||
package com.volmit.iris.engine;
|
package com.volmit.iris.engine;
|
||||||
|
|
||||||
|
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
|
||||||
import com.volmit.iris.engine.framework.Engine;
|
import com.volmit.iris.engine.framework.Engine;
|
||||||
import com.volmit.iris.engine.framework.EngineParallaxManager;
|
import com.volmit.iris.engine.framework.EngineParallaxManager;
|
||||||
|
import com.volmit.iris.engine.object.IrisFeaturePositional;
|
||||||
|
import com.volmit.iris.engine.stream.utility.CachedStream2D;
|
||||||
|
import com.volmit.iris.util.collection.KList;
|
||||||
|
import com.volmit.iris.util.scheduling.IrisLock;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
public class IrisEngineParallax implements EngineParallaxManager {
|
public class IrisEngineParallax implements EngineParallaxManager {
|
||||||
@ -29,6 +34,16 @@ public class IrisEngineParallax implements EngineParallaxManager {
|
|||||||
@Getter
|
@Getter
|
||||||
private final int parallaxSize;
|
private final int parallaxSize;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final IrisLock featureLock = new IrisLock("Feature");
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final ConcurrentLinkedHashMap<Long, KList<IrisFeaturePositional>> featureCache = new ConcurrentLinkedHashMap.Builder<Long, KList<IrisFeaturePositional>>()
|
||||||
|
.initialCapacity(1024)
|
||||||
|
.maximumWeightedCapacity(1024)
|
||||||
|
.concurrencyLevel(32)
|
||||||
|
.build();
|
||||||
|
|
||||||
public IrisEngineParallax(Engine engine) {
|
public IrisEngineParallax(Engine engine) {
|
||||||
this.engine = engine;
|
this.engine = engine;
|
||||||
parallaxSize = computeParallaxSize();
|
parallaxSize = computeParallaxSize();
|
||||||
|
@ -20,7 +20,7 @@ package com.volmit.iris.engine.framework;
|
|||||||
|
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.IrisDataManager;
|
import com.volmit.iris.core.IrisDataManager;
|
||||||
import com.volmit.iris.engine.actuator.IrisTerrainActuator;
|
import com.volmit.iris.engine.actuator.IrisTerrainNormalActuator;
|
||||||
import com.volmit.iris.engine.data.DataProvider;
|
import com.volmit.iris.engine.data.DataProvider;
|
||||||
import com.volmit.iris.engine.hunk.Hunk;
|
import com.volmit.iris.engine.hunk.Hunk;
|
||||||
import com.volmit.iris.engine.object.IrisBiome;
|
import com.volmit.iris.engine.object.IrisBiome;
|
||||||
@ -158,7 +158,7 @@ public interface EngineCompound extends Listener, Hotloadable, DataProvider {
|
|||||||
Engine e = getEngine(i);
|
Engine e = getEngine(i);
|
||||||
|
|
||||||
if (e.getDimension().isBedrock()) {
|
if (e.getDimension().isBedrock()) {
|
||||||
int m = ((IrisTerrainActuator) e.getFramework().getTerrainActuator()).getLastBedrock();
|
int m = ((IrisTerrainNormalActuator) e.getFramework().getTerrainActuator()).getLastBedrock();
|
||||||
|
|
||||||
if (f > m) {
|
if (f > m) {
|
||||||
f = m;
|
f = m;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
package com.volmit.iris.engine.framework;
|
package com.volmit.iris.engine.framework;
|
||||||
|
|
||||||
|
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
|
||||||
import com.volmit.iris.Iris;
|
import com.volmit.iris.Iris;
|
||||||
import com.volmit.iris.core.IrisDataManager;
|
import com.volmit.iris.core.IrisDataManager;
|
||||||
import com.volmit.iris.engine.IrisComplex;
|
import com.volmit.iris.engine.IrisComplex;
|
||||||
@ -40,6 +41,7 @@ import com.volmit.iris.util.collection.KSet;
|
|||||||
import com.volmit.iris.util.format.Form;
|
import com.volmit.iris.util.format.Form;
|
||||||
import com.volmit.iris.util.function.Consumer4;
|
import com.volmit.iris.util.function.Consumer4;
|
||||||
import com.volmit.iris.util.math.RNG;
|
import com.volmit.iris.util.math.RNG;
|
||||||
|
import com.volmit.iris.util.scheduling.IrisLock;
|
||||||
import com.volmit.iris.util.scheduling.J;
|
import com.volmit.iris.util.scheduling.J;
|
||||||
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
|
||||||
import org.bukkit.Chunk;
|
import org.bukkit.Chunk;
|
||||||
@ -192,10 +194,25 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConcurrentLinkedHashMap<Long, KList<IrisFeaturePositional>> getFeatureCache();
|
||||||
|
|
||||||
|
IrisLock getFeatureLock();
|
||||||
|
|
||||||
default void forEachFeature(double x, double z, Consumer<IrisFeaturePositional> f) {
|
default void forEachFeature(double x, double z, Consumer<IrisFeaturePositional> f) {
|
||||||
|
long key = Cache.key(((int)x)>>4, ((int)z) >> 4);
|
||||||
|
|
||||||
|
for(IrisFeaturePositional ipf : getFeatureCache().compute(key, (ke, v) -> {
|
||||||
|
if(v != null)
|
||||||
|
{
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
getFeatureLock().lock();
|
||||||
|
KList<IrisFeaturePositional> pos = new KList<>();
|
||||||
|
|
||||||
for (IrisFeaturePositional i : getEngine().getDimension().getSpecificFeatures()) {
|
for (IrisFeaturePositional i : getEngine().getDimension().getSpecificFeatures()) {
|
||||||
if (i.shouldFilter(x, z)) {
|
if (i.shouldFilter(x, z)) {
|
||||||
f.accept(i);
|
pos.add(i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,10 +226,11 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
ParallaxChunkMeta m = getParallaxAccess().getMetaR(i + cx, j + cz);
|
ParallaxChunkMeta m = getParallaxAccess().getMetaR(i + cx, j + cz);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
synchronized (m.getFeatures()) {
|
synchronized (m.getFeatures())
|
||||||
|
{
|
||||||
for (IrisFeaturePositional k : m.getFeatures()) {
|
for (IrisFeaturePositional k : m.getFeatures()) {
|
||||||
if (k.shouldFilter(x, z)) {
|
if (k.shouldFilter(x, z)) {
|
||||||
f.accept(k);
|
pos.add(k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -223,10 +241,22 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
getFeatureLock().unlock();
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
f.accept(ipf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
|
@SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
|
||||||
default void generateParallaxArea(int x, int z) {
|
default void generateParallaxArea(int x, int z) {
|
||||||
|
if(!getEngine().getDimension().isPlaceObjects())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
PrecisionStopwatch p = PrecisionStopwatch.start();
|
PrecisionStopwatch p = PrecisionStopwatch.start();
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ import com.google.gson.Gson;
|
|||||||
import com.volmit.iris.engine.hunk.io.HunkIOAdapter;
|
import com.volmit.iris.engine.hunk.io.HunkIOAdapter;
|
||||||
import com.volmit.iris.engine.hunk.io.PaletteHunkIOAdapter;
|
import com.volmit.iris.engine.hunk.io.PaletteHunkIOAdapter;
|
||||||
import com.volmit.iris.engine.object.IrisFeaturePositional;
|
import com.volmit.iris.engine.object.IrisFeaturePositional;
|
||||||
|
import com.volmit.iris.util.collection.KList;
|
||||||
import com.volmit.iris.util.oldnbt.CompoundTag;
|
import com.volmit.iris.util.oldnbt.CompoundTag;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@ -56,9 +57,9 @@ public class ParallaxChunkMeta {
|
|||||||
private int maxObject = -1;
|
private int maxObject = -1;
|
||||||
private int minObject = -1;
|
private int minObject = -1;
|
||||||
private int count;
|
private int count;
|
||||||
private CopyOnWriteArrayList<IrisFeaturePositional> features;
|
private KList<IrisFeaturePositional> features;
|
||||||
|
|
||||||
public ParallaxChunkMeta() {
|
public ParallaxChunkMeta() {
|
||||||
this(false, false, false, false, false, false, -1, -1, 0, new CopyOnWriteArrayList<>());
|
this(false, false, false, false, false, false, -1, -1, 0, new KList<>());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user