Improve feature performance

This commit is contained in:
Daniel Mills 2021-07-27 15:38:37 -04:00
parent 295e51181b
commit 9de4bf839f
2 changed files with 38 additions and 8 deletions

View File

@ -19,12 +19,15 @@
package com.volmit.iris.engine; package com.volmit.iris.engine;
import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap;
import com.volmit.iris.engine.cache.Cache;
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.object.IrisFeaturePositional;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.documentation.BlockCoordinates;
import com.volmit.iris.util.scheduling.IrisLock; import com.volmit.iris.util.scheduling.IrisLock;
import lombok.Getter; import lombok.Getter;
import org.bukkit.util.Consumer;
public class IrisEngineParallax implements EngineParallaxManager { public class IrisEngineParallax implements EngineParallaxManager {
@Getter @Getter
@ -33,10 +36,6 @@ 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>>() private final ConcurrentLinkedHashMap<Long, KList<IrisFeaturePositional>> featureCache = new ConcurrentLinkedHashMap.Builder<Long, KList<IrisFeaturePositional>>()
.initialCapacity(1024) .initialCapacity(1024)
.maximumWeightedCapacity(1024) .maximumWeightedCapacity(1024)
@ -47,4 +46,39 @@ public class IrisEngineParallax implements EngineParallaxManager {
this.engine = engine; this.engine = engine;
parallaxSize = computeParallaxSize(); parallaxSize = computeParallaxSize();
} }
@Override
@BlockCoordinates
public void forEachFeature(double x, double z, Consumer<IrisFeaturePositional> f) {
if (!getEngine().getDimension().hasFeatures(getEngine())) {
return;
}
for (IrisFeaturePositional ipf : forEachFeature(x, z)) {
f.accept(ipf);
}
}
@Override
@BlockCoordinates
public KList<IrisFeaturePositional> forEachFeature(double x, double z) {
int cx = ((int)x) >> 4;
int cz = ((int)x) >> 4;
long key = Cache.key(cx, cz);
return featureCache.compute(key, (k, v) -> {
if(v != null)
{
return v;
}
KList<IrisFeaturePositional> pos = new KList<>();
pos.addAll(EngineParallaxManager.super.forEachFeature(cx << 4, cz << 4));
pos.addAll(EngineParallaxManager.super.forEachFeature((cx << 4) + 15, cz << 4));
pos.addAll(EngineParallaxManager.super.forEachFeature(cx << 4, (cz << 4) + 15));
pos.addAll(EngineParallaxManager.super.forEachFeature((cx << 4) + 15, (cz << 4) + 15));
pos.removeDuplicates();
return pos;
});
}
} }

View File

@ -200,10 +200,6 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
} }
} }
ConcurrentLinkedHashMap<Long, KList<IrisFeaturePositional>> getFeatureCache();
IrisLock getFeatureLock();
@BlockCoordinates @BlockCoordinates
default void forEachFeature(double x, double z, Consumer<IrisFeaturePositional> f) { default void forEachFeature(double x, double z, Consumer<IrisFeaturePositional> f) {
if (!getEngine().getDimension().hasFeatures(getEngine())) { if (!getEngine().getDimension().hasFeatures(getEngine())) {