3
0

Cap chunk generation to 1 chunk per tick (configurable)

This commit is contained in:
Sergey Shatunov
2016-03-16 12:01:28 +07:00
parent 232bc98881
commit 8d2ba00f70
9 changed files with 261 additions and 60 deletions

View File

@ -1,6 +1,25 @@
--- ../src-base/minecraft/net/minecraftforge/common/chunkio/ChunkIOExecutor.java
+++ ../src-work/minecraft/net/minecraftforge/common/chunkio/ChunkIOExecutor.java
@@ -22,7 +22,7 @@
@@ -6,27 +6,57 @@
static final int BASE_THREADS = 1;
static final int PLAYERS_PER_THREAD = 50;
- private static final AsynchronousExecutor<QueuedChunk, net.minecraft.world.chunk.Chunk, Runnable, RuntimeException> instance = new AsynchronousExecutor<QueuedChunk, net.minecraft.world.chunk.Chunk, Runnable, RuntimeException>(new ChunkIOProvider(), BASE_THREADS);
+ private static final AsynchronousExecutor<QueuedChunk, net.minecraft.world.chunk.Chunk, kcauldron.ChunkCallback, RuntimeException> instance = new AsynchronousExecutor<QueuedChunk, net.minecraft.world.chunk.Chunk, kcauldron.ChunkCallback, RuntimeException>(new ChunkIOProvider(), BASE_THREADS); // KCauldron
public static net.minecraft.world.chunk.Chunk syncChunkLoad(net.minecraft.world.World world, net.minecraft.world.chunk.storage.AnvilChunkLoader loader, net.minecraft.world.gen.ChunkProviderServer provider, int x, int z) {
return instance.getSkipQueue(new QueuedChunk(x, z, loader, world, provider));
}
public static void queueChunkLoad(net.minecraft.world.World world, net.minecraft.world.chunk.storage.AnvilChunkLoader loader, net.minecraft.world.gen.ChunkProviderServer provider, int x, int z, Runnable runnable) {
- instance.add(new QueuedChunk(x, z, loader, world, provider), runnable);
+ instance.add(new QueuedChunk(x, z, loader, world, provider), new RunnableCallback(runnable)); // KCauldron
}
// Abuses the fact that hashCode and equals for QueuedChunk only use world and coords
public static void dropQueuedChunkLoad(net.minecraft.world.World world, int x, int z, Runnable runnable) {
- instance.drop(new QueuedChunk(x, z, null, world, null), runnable);
+ instance.drop(new QueuedChunk(x, z, null, world, null), new RunnableCallback(runnable));
}
public static void adjustPoolSize(int players) {
@ -9,3 +28,37 @@
instance.setActiveThreads(size);
}
public static void tick() {
instance.finishActive();
}
+
+ // KCauldron start
+ public static void queueChunkLoad(net.minecraft.world.World world,
+ net.minecraft.world.chunk.storage.AnvilChunkLoader loader,
+ net.minecraft.world.gen.ChunkProviderServer provider, int x, int z, kcauldron.ChunkCallback runnable) {
+ instance.add(new QueuedChunk(x, z, loader, world, provider), runnable);
+ }
+
+ public static final class RunnableCallback implements kcauldron.ChunkCallback {
+ private final Runnable runnable;
+
+ public RunnableCallback(Runnable runnable) {
+ this.runnable = runnable;
+ }
+
+ @Override
+ public void onChunkLoaded(net.minecraft.world.chunk.Chunk chunk) {
+ runnable.run();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this)
+ return true;
+ Runnable runnable = obj instanceof Runnable ? (Runnable) obj
+ : obj instanceof RunnableCallback ? ((RunnableCallback) obj).runnable : null;
+ return this.runnable == runnable;
+ }
+ }
+ // KCauldron end
}

View File

@ -1,16 +1,18 @@
--- ../src-base/minecraft/net/minecraftforge/common/chunkio/ChunkIOProvider.java
+++ ../src-work/minecraft/net/minecraftforge/common/chunkio/ChunkIOProvider.java
@@ -9,6 +9,9 @@
@@ -9,7 +9,10 @@
import java.io.IOException;
import java.util.concurrent.atomic.AtomicInteger;
-class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChunk, net.minecraft.world.chunk.Chunk, Runnable, RuntimeException> {
+import org.bukkit.Server;
+import org.bukkit.craftbukkit.util.LongHash;
+
class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChunk, net.minecraft.world.chunk.Chunk, Runnable, RuntimeException> {
+class ChunkIOProvider implements AsynchronousExecutor.CallBackProvider<QueuedChunk, net.minecraft.world.chunk.Chunk, kcauldron.ChunkCallback, RuntimeException> {
private final AtomicInteger threadNumber = new AtomicInteger(1);
@@ -41,14 +44,36 @@
// async stuff
@@ -41,19 +44,41 @@
queuedChunk.loader.loadEntities(queuedChunk.world, queuedChunk.compound.getCompoundTag("Level"), chunk);
MinecraftForge.EVENT_BUS.post(new ChunkDataEvent.Load(chunk, queuedChunk.compound)); // Don't call ChunkDataEvent.Load async
chunk.lastSaveTime = queuedChunk.provider.worldObj.getTotalWorldTime();
@ -48,3 +50,10 @@
chunk.populateChunk(queuedChunk.provider, queuedChunk.provider, queuedChunk.x, queuedChunk.z);
}
- public void callStage3(QueuedChunk queuedChunk, net.minecraft.world.chunk.Chunk chunk, Runnable runnable) throws RuntimeException {
- runnable.run();
+ public void callStage3(QueuedChunk queuedChunk, net.minecraft.world.chunk.Chunk chunk, kcauldron.ChunkCallback callback) throws RuntimeException {
+ callback.onChunkLoaded(chunk);
}
public Thread newThread(Runnable runnable) {

View File

@ -0,0 +1,13 @@
--- ../src-base/minecraft/net/minecraftforge/common/util/AsynchronousExecutor.java
+++ ../src-work/minecraft/net/minecraftforge/common/util/AsynchronousExecutor.java
@@ -268,8 +268,8 @@
if (task == null) {
// Print debug info for QueuedChunk and avoid crash
//throw new IllegalStateException("Unknown " + parameter);
- FMLLog.info("Unknown %s", parameter);
- FMLLog.info("This should not happen. Please report this error to Forge.");
+ //FMLLog.info("Unknown %s", parameter); // KCauldron
+ //FMLLog.info("This should not happen. Please report this error to Forge."); // KCauldron
return false;
}
if (!task.callbacks.remove(callback)) {