Faster Interpolatin

This commit is contained in:
Daniel Mills 2021-08-03 18:03:27 -04:00
parent 36d3849118
commit 672c39e58d
9 changed files with 149 additions and 75 deletions

View File

@ -33,7 +33,7 @@ plugins {
}
group 'com.volmit.iris'
version '1.5.18'
version '1.6'
def apiVersion = '1.17'
def name = 'Iris'
def main = 'com.volmit.iris.Iris'
@ -58,7 +58,6 @@ task copyDepends(type: Copy) {
}
task release(type: proguard.gradle.ProGuardTask) {
System.out.println("Java Mod: " + "${System.getProperty('java.home')}\\jmods\\java.base.jmod")
dependsOn(":copyDepends")
group('proguard')
configuration 'proguard.pro'
@ -115,27 +114,18 @@ shadowJar
minimize()
relocate 'com.dfsek.paralithic', 'com.volmit.iris.util.paralithic'
relocate 'io.papermc.lib', 'com.volmit.iris.util.paper'
relocate 'org.objectweb.asm', 'com.volmit.iris.util.asm'
relocate 'org.zeroturnaround.zip', 'com.volmit.iris.util.zlib'
relocate 'com.googlecode.concurrentlinkedhashmap', 'com.volmit.iris.util.collection'
dependencies {
include(dependency('org.zeroturnaround:zt-zip:1.14'))
include(dependency('com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2'))
include(dependency('io.papermc:paperlib:1.0.5'))
include(dependency('com.dfsek:Paralithic:0.4.0'))
include(dependency('org.ow2.asm:asm:9.0'))
}
}
manifest()
dependencies {
// Provided or Classpath
compileOnly 'org.projectlombok:lombok:1.18.20'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
implementation 'com.dfsek:Paralithic:0.4.0'
implementation 'org.zeroturnaround:zt-zip:1.14'
implementation 'io.papermc:paperlib:1.0.5'
implementation 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2'
implementation 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT'
implementation 'org.bukkit.craftbukkit:1.17:1.17'
implementation 'org.bukkit.craftbukkit:1.17.1:1.17.1'
@ -143,7 +133,17 @@ dependencies {
implementation 'org.bukkit.craftbukkit:1.16.3:1.16.3'
implementation 'org.bukkit.craftbukkit:1.16.1:1.16.1'
implementation 'com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'me.clip:placeholderapi:2.10.10'
// Shaded
implementation 'com.dfsek:Paralithic:0.4.0'
implementation 'io.papermc:paperlib:1.0.5'
// Dynamically Loaded
implementation 'it.unimi.dsi:fastutil:8.5.4'
implementation 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2'
implementation 'org.zeroturnaround:zt-zip:1.14'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'org.ow2.asm:asm:9.0'
implementation 'com.google.guava:guava:30.1.1-jre'
}

View File

@ -431,12 +431,14 @@ public class IrisComplex implements DataProvider {
double h = 0;
for (IrisGenerator gen : generators) {
double hi = gen.getInterpolator().interpolate(x, z, (xx, zz) ->
h += gen.getInterpolator().interpolate(x, z, (xx, zz) ->
{
try {
IrisBiome bx = baseBiomeStream.get(xx, zz);
return bx.getGenLinkMax(gen.getLoadKey());
return M.lerp(bx.getGenLinkMin(gen.getLoadKey()),
bx.getGenLinkMax(gen.getLoadKey()),
gen.getHeight(x, z, seed + 239945));
} catch (Throwable e) {
Iris.reportError(e);
e.printStackTrace();
@ -445,23 +447,6 @@ public class IrisComplex implements DataProvider {
return 0;
});
double lo = gen.getInterpolator().interpolate(x, z, (xx, zz) ->
{
try {
IrisBiome bx = baseBiomeStream.get(xx, zz);
return bx.getGenLinkMin(gen.getLoadKey());
} catch (Throwable e) {
Iris.reportError(e);
e.printStackTrace();
Iris.warn("Failed to sample lo biome at " + xx + " " + zz + " using the generator " + gen.getLoadKey());
}
return 0;
});
h += M.lerp(lo, hi, gen.getHeight(x, z, seed + 239945));
}
AtomicDouble noise = new AtomicDouble(h + fluidHeight + overlayStream.get(x, z));

View File

@ -70,7 +70,7 @@ public class IrisWorldManager extends EngineAssignedWorldManager {
}
int maxGroups = 3;
int biomeBaseCooldownSeconds = 15;
int biomeBaseCooldownSeconds = 0;
for (UUID i : spawnCooldowns.k()) {
if (M.ms() - spawnCooldowns.get(i) > TimeUnit.SECONDS.toMillis(biomeBaseCooldownSeconds)) {

View File

@ -48,6 +48,7 @@ import com.volmit.iris.util.plugin.VolmitSender;
import com.volmit.iris.util.reflect.V;
import com.volmit.iris.util.scheduling.ChronoLatch;
import com.volmit.iris.util.scheduling.J;
import com.volmit.iris.util.scheduling.Looper;
import com.volmit.iris.util.scheduling.PrecisionStopwatch;
import io.netty.util.internal.ConcurrentSet;
import lombok.Getter;
@ -83,9 +84,12 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
private final ChronoLatch hotloadcd;
@Getter
private double generatedPerSecond = 0;
private final int art;
private ReactiveFolder hotloader = null;
private IrisWorld cworld = null;
private final Looper ticker;
private final Looper cleaner;
private int hotloaderMisses = 0;
private long lastHotloadTime = 100;
public EngineCompositeGenerator() {
this(null, true);
@ -93,12 +97,53 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
public EngineCompositeGenerator(String query, boolean production) {
super();
ticker = new Looper() {
@Override
protected long loop() {
PrecisionStopwatch p = PrecisionStopwatch.start();
if(!tickHotloader())
{
hotloaderMisses++;
}
else
{
hotloaderMisses = 0;
}
lastHotloadTime+= p.getMilliseconds();
lastHotloadTime /= 2;
return 120 + (long)(lastHotloadTime/2) + Math.min(hotloaderMisses * 125, 1375);
}
};
ticker.setPriority(Thread.MIN_PRIORITY);
ticker.setName("Iris Project Manager");
cleaner = new Looper() {
@Override
protected long loop() {
if(getComposite() != null)
{
getComposite().clean();
}
return 10000;
}
};
cleaner.setPriority(Thread.MIN_PRIORITY);
cleaner.setName("Iris Parallax Manager");
cleaner.start();
if(isStudio())
{
ticker.start();
}
hotloadcd = new ChronoLatch(3500);
mst = M.ms();
this.production = production;
this.dimensionQuery = query;
initialized = new AtomicBoolean(false);
art = J.ar(this::tick, 40);
populators = new KList<BlockPopulator>().qadd(new BlockPopulator() {
@Override
public void populate(World world, Random random, Chunk chunk) {
@ -137,35 +182,24 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
}
}
public void tick() {
public boolean tickHotloader() {
if (getComposite() == null || isClosed()) {
return;
return false;
}
if (!initialized.get()) {
return;
}
int pri = Thread.currentThread().getPriority();
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
if (M.ms() - mst > 1000) {
generatedPerSecond = (double) (generated - lgenerated) / ((double) (M.ms() - mst) / 1000D);
mst = M.ms();
lgenerated = generated;
return false;
}
try {
if (hotloader != null) {
hotloader.check();
getComposite().clean();
return hotloader.check();
}
} catch (Throwable e) {
Iris.reportError(e);
}
Thread.currentThread().setPriority(pri);
return false;
}
private synchronized IrisDimension getDimension(IrisWorld world) {
@ -562,6 +596,8 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
public Runnable generateChunkRawData(IrisWorld world, int x, int z, TerrainChunk tc, boolean multicore) {
initialize(world);
tickMetrics();
Hunk<BlockData> blocks = Hunk.view((ChunkData) tc);
Hunk<Biome> biomes = Hunk.view((BiomeGrid) tc);
Hunk<BlockData> post = Hunk.newAtomicHunk(biomes.getWidth(), biomes.getHeight(), biomes.getDepth());
@ -570,6 +606,14 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
return () -> blocks.insertSoftly(0, 0, 0, post, (b) -> b == null || B.isAirOrFluid(b));
}
private void tickMetrics() {
if (M.ms() - mst > 1000) {
generatedPerSecond = (double) (generated - lgenerated) / ((double) (M.ms() - mst) / 1000D);
mst = M.ms();
lgenerated = generated;
}
}
@Override
public boolean canSpawn(World world, int x, int z) {
return super.canSpawn(world, x, z);
@ -689,7 +733,11 @@ public class EngineCompositeGenerator extends ChunkGenerator implements IrisAcce
@Override
public void close() {
J.car(art);
if(isStudio())
{
ticker.interrupt();
}
if (getComposite() != null) {
getComposite().close();

View File

@ -586,6 +586,8 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
}
for (IrisFeaturePotential j : p.getAddFeatures()) {
if(j.hasZone(rng, xx >> 4, zz >> 4))
{
ParallaxChunkMeta rw = getParallaxAccess().getMetaRW(xx >> 4, zz >> 4);
double a = Math.max(v.getW(), v.getD());
@ -598,6 +600,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
rw.getFeatures().add(new IrisFeaturePositional(xx, zz, j.getZone()));
}
}
}
}
@ -646,6 +649,8 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
}
for (IrisFeaturePotential j : objectPlacement.getAddFeatures()) {
if(j.hasZone(rng, xx >> 4, zz >> 4))
{
ParallaxChunkMeta rw = getParallaxAccess().getMetaRW(xx >> 4, zz >> 4);
double a = Math.max(v.getW(), v.getD());
@ -660,6 +665,7 @@ public interface EngineParallaxManager extends DataProvider, IObjectPlacer {
}
}
}
}
default void updateParallaxChunkObjectData(int minY, int maxY, int x, int z, IrisObject v) {
ParallaxChunkMeta meta = getParallaxAccess().getMetaRW(x >> 4, z >> 4);

View File

@ -138,6 +138,7 @@ public class IrisEntitySpawn implements IRare {
return e;
} catch (Throwable e) {
Iris.reportError(e);
e.printStackTrace();
Iris.error(" Failed to retrieve real entity @ " + at);
return null;
}

View File

@ -20,6 +20,7 @@ package com.volmit.iris.util.io;
import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.math.M;
import java.io.File;
@ -48,10 +49,6 @@ public class FolderWatcher extends FileWatcher {
}
}
if (watchers == null) {
System.out.print("wtf");
}
for (File i : watchers.k()) {
if (!i.exists()) {
watchers.remove(i);
@ -71,13 +68,13 @@ public class FolderWatcher extends FileWatcher {
KMap<File, FolderWatcher> w = watchers.copy();
readProperties();
for (File i : w.k()) {
for (File i : w.keySet()) {
if (!watchers.containsKey(i)) {
deleted.add(i);
}
}
for (File i : watchers.k()) {
for (File i : watchers.keySet()) {
if (!w.containsKey(i)) {
created.add(i);
} else {
@ -98,6 +95,34 @@ public class FolderWatcher extends FileWatcher {
return super.checkModified();
}
public boolean checkModifiedFast() {
if(watchers == null || watchers.isEmpty())
{
return checkModified();
}
changed.clear();
created.clear();
deleted.clear();
if (file.isDirectory()) {
for (File i : watchers.keySet()) {
FolderWatcher fw = watchers.get(i);
if (fw.checkModifiedFast()) {
changed.add(fw.file);
}
changed.addAll(fw.getChanged());
created.addAll(fw.getCreated());
deleted.addAll(fw.getDeleted());
}
return !changed.isEmpty() || !created.isEmpty() || !deleted.isEmpty();
}
return super.checkModified();
}
public KMap<File, FolderWatcher> getWatchers() {
return watchers;
}

View File

@ -27,6 +27,7 @@ public class ReactiveFolder {
private final File folder;
private final Consumer3<KList<File>, KList<File>, KList<File>> hotload;
private FolderWatcher fw;
private int checkCycle = 0;
public ReactiveFolder(File folder, Consumer3<KList<File>, KList<File>, KList<File>> hotload) {
this.folder = folder;
@ -39,10 +40,11 @@ public class ReactiveFolder {
fw = new FolderWatcher(folder);
}
public void check() {
public boolean check() {
checkCycle++;
boolean modified = false;
if (fw.checkModified()) {
if (checkCycle % 3 == 0 ? fw.checkModified() : fw.checkModifiedFast()) {
for (File i : fw.getCreated()) {
if (i.getName().endsWith(".iob") || i.getName().endsWith(".json")) {
modified = true;
@ -73,6 +75,6 @@ public class ReactiveFolder {
hotload.accept(fw.getCreated(), fw.getChanged(), fw.getDeleted());
}
fw.checkModified();
return fw.checkModified();
}
}

View File

@ -5,6 +5,13 @@ load: STARTUP
authors: [ cyberpwn, NextdoorPsycho ]
website: volmit.com
description: More than a Dimenson!
libraries:
- org.zeroturnaround:zt-zip:1.14
- com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.4.2
- org.ow2.asm:asm:9.0
- com.google.code.gson:gson:2.8.5
- it.unimi.dsi:fastutil:8.5.4
- com.google.guava:guava:30.1.1-jre
commands:
iris:
aliases: [ ir, irs ]