Lock the piss out of the parallax layer

This commit is contained in:
Daniel Mills 2021-07-31 08:18:21 -04:00
parent cc95042a94
commit 229f3dc061

View File

@ -22,6 +22,8 @@ import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.engine.hunk.Hunk; import com.volmit.iris.engine.hunk.Hunk;
import com.volmit.iris.engine.object.tile.TileData; import com.volmit.iris.engine.object.tile.TileData;
import com.volmit.iris.engine.parallel.GridLock;
import com.volmit.iris.engine.parallel.HyperLock;
import com.volmit.iris.engine.parallel.MultiBurst; import com.volmit.iris.engine.parallel.MultiBurst;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KMap;
@ -38,12 +40,14 @@ import java.io.IOException;
public class ParallaxWorld implements ParallaxAccess { public class ParallaxWorld implements ParallaxAccess {
private final KMap<Long, ParallaxRegion> loadedRegions; private final KMap<Long, ParallaxRegion> loadedRegions;
private final KList<Long> save; private final KList<Long> save;
private final HyperLock hlock;
private final File folder; private final File folder;
private final MultiBurst burst; private final MultiBurst burst;
private final int height; private final int height;
public ParallaxWorld(MultiBurst burst, int height, File folder) { public ParallaxWorld(MultiBurst burst, int height, File folder) {
this.height = height; this.height = height;
this.hlock = new HyperLock(1024);
this.burst = burst; this.burst = burst;
this.folder = folder; this.folder = folder;
save = new KList<>(); save = new KList<>();
@ -81,7 +85,7 @@ public class ParallaxWorld implements ParallaxAccess {
public void save(ParallaxRegion region) { public void save(ParallaxRegion region) {
try { try {
region.save(); hlock.withIO(region.getX(), region.getZ(), () -> region.save());
} catch (IOException e) { } catch (IOException e) {
Iris.reportError(e); Iris.reportError(e);
e.printStackTrace(); e.printStackTrace();
@ -95,60 +99,70 @@ public class ParallaxWorld implements ParallaxAccess {
@RegionCoordinates @RegionCoordinates
public void save(int x, int z) { public void save(int x, int z) {
if (isLoaded(x, z)) { hlock.with(x, z, () -> {
save(getR(x, z)); if (isLoaded(x, z)) {
} save(getR(x, z));
}
});
} }
@RegionCoordinates @RegionCoordinates
public int unload(int x, int z) { public int unload(int x, int z) {
long key = key(x, z); return hlock.withResult(x, z, () -> {
int v = 0; long key = key(x, z);
if (isLoaded(x, z)) { int v = 0;
if (save.contains(key)) { if (isLoaded(x, z)) {
save(x, z); if (save.contains(key)) {
save.remove(key); save(x, z);
save.remove(key);
}
ParallaxRegion lr = loadedRegions.remove(key);
if (lr != null) {
v += lr.unload();
}
} }
ParallaxRegion lr = loadedRegions.remove(key); return v;
});
if (lr != null) {
v += lr.unload();
}
}
return v;
} }
@RegionCoordinates @RegionCoordinates
public ParallaxRegion load(int x, int z) { public ParallaxRegion load(int x, int z) {
if (isLoaded(x, z)) { return hlock.withResult(x, z, () -> {
return loadedRegions.get(key(x, z)); if (isLoaded(x, z)) {
} return loadedRegions.get(key(x, z));
}
ParallaxRegion v = new ParallaxRegion(burst, height, folder, x, z); ParallaxRegion v = new ParallaxRegion(burst, height, folder, x, z);
loadedRegions.put(key(x, z), v); loadedRegions.put(key(x, z), v);
return v; return v;
});
} }
@RegionCoordinates @RegionCoordinates
public ParallaxRegion getR(int x, int z) { public ParallaxRegion getR(int x, int z) {
long key = key(x, z); return hlock.withResult(x, z, () -> {
long key = key(x, z);
ParallaxRegion region = loadedRegions.get(key); ParallaxRegion region = loadedRegions.get(key);
if (region == null) { if (region == null) {
region = load(x, z); region = load(x, z);
} }
return region; return region;
});
} }
@RegionCoordinates @RegionCoordinates
public ParallaxRegion getRW(int x, int z) { public ParallaxRegion getRW(int x, int z) {
save.addIfMissing(key(x, z)); return hlock.withResult(x, z, () -> {
return getR(x, z); save.addIfMissing(key(x, z));
return getR(x, z);
});
} }
@RegionCoordinates @RegionCoordinates