make the packer queue super cute and deduplicated
This commit is contained in:
parent
e6ba4ef309
commit
38d047dbd1
29
src/main/java/baritone/cache/CachedWorld.java
vendored
29
src/main/java/baritone/cache/CachedWorld.java
vendored
@ -26,6 +26,7 @@ import baritone.api.utils.Helper;
|
|||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
||||||
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.ChunkPos;
|
||||||
import net.minecraft.world.chunk.Chunk;
|
import net.minecraft.world.chunk.Chunk;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -33,6 +34,8 @@ import java.nio.file.Files;
|
|||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,7 +59,17 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
*/
|
*/
|
||||||
private final String directory;
|
private final String directory;
|
||||||
|
|
||||||
private final LinkedBlockingQueue<Chunk> toPack = new LinkedBlockingQueue<>();
|
/**
|
||||||
|
* Queue of positions to pack. Refers to the toPackMap, in that every element of this queue will be a
|
||||||
|
* key in that map.
|
||||||
|
*/
|
||||||
|
private final LinkedBlockingQueue<ChunkPos> toPackQueue = new LinkedBlockingQueue<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All chunk positions pending packing. This map will be updated in-place if a new update to the chunk occurs
|
||||||
|
* while waiting in the queue for the packer thread to get to it.
|
||||||
|
*/
|
||||||
|
private final Map<ChunkPos, Chunk> toPackMap = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private final int dimension;
|
private final int dimension;
|
||||||
|
|
||||||
@ -89,10 +102,8 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final void queueForPacking(Chunk chunk) {
|
public final void queueForPacking(Chunk chunk) {
|
||||||
try {
|
if (toPackMap.put(chunk.getPos(), chunk) == null) {
|
||||||
toPack.put(chunk);
|
toPackQueue.add(chunk.getPos());
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,13 +304,9 @@ public final class CachedWorld implements ICachedWorld, Helper {
|
|||||||
|
|
||||||
public void run() {
|
public void run() {
|
||||||
while (true) {
|
while (true) {
|
||||||
// TODO: Add CachedWorld unloading to remove the redundancy of having this
|
|
||||||
LinkedBlockingQueue<Chunk> queue = toPack;
|
|
||||||
if (queue == null) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
Chunk chunk = queue.take();
|
ChunkPos pos = toPackQueue.take();
|
||||||
|
Chunk chunk = toPackMap.remove(pos);
|
||||||
CachedChunk cached = ChunkPacker.pack(chunk);
|
CachedChunk cached = ChunkPacker.pack(chunk);
|
||||||
CachedWorld.this.updateCachedChunk(cached);
|
CachedWorld.this.updateCachedChunk(cached);
|
||||||
//System.out.println("Processed chunk at " + chunk.x + "," + chunk.z);
|
//System.out.println("Processed chunk at " + chunk.x + "," + chunk.z);
|
||||||
|
Loading…
Reference in New Issue
Block a user