Skip to content

Commit

Permalink
perf: improve chunk transition speed
Browse files Browse the repository at this point in the history
  • Loading branch information
ishland committed Jul 26, 2023
1 parent 012dae6 commit 1815657
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
Expand Up @@ -5,6 +5,7 @@
import net.minecraft.server.world.ServerWorld;
import net.minecraft.server.world.ThreadedAnvilChunkStorage;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.util.thread.ThreadExecutor;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;
Expand All @@ -30,4 +31,7 @@ public interface IThreadedAnvilChunkStorage {
@Invoker
void invokeReleaseLightTicket(ChunkPos pos);

@Accessor
ThreadExecutor<Runnable> getMainThreadExecutor();

}
@@ -0,0 +1,43 @@
package com.ishland.c2me.threading.worldgen.mixin;

import com.ishland.c2me.base.mixin.access.IThreadedAnvilChunkStorage;
import com.ishland.c2me.threading.worldgen.common.Config;
import com.mojang.datafixers.util.Either;
import net.minecraft.server.world.ChunkHolder;
import net.minecraft.server.world.ThreadedAnvilChunkStorage;
import net.minecraft.util.thread.ThreadExecutor;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.ChunkStatus;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

import java.util.concurrent.CompletableFuture;

@Mixin(value = ChunkHolder.class, priority = 1110)
public abstract class MixinChunkHolder {

@Shadow public abstract CompletableFuture<Either<Chunk, ChunkHolder.Unloaded>> getChunkAt(ChunkStatus targetStatus, ThreadedAnvilChunkStorage chunkStorage);

@Redirect(method = "getChunkAt", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ThreadedAnvilChunkStorage;getChunk(Lnet/minecraft/server/world/ChunkHolder;Lnet/minecraft/world/chunk/ChunkStatus;)Ljava/util/concurrent/CompletableFuture;"))
private CompletableFuture<Either<Chunk, ChunkHolder.Unloaded>> redirectGetChunk(ThreadedAnvilChunkStorage instance, ChunkHolder holder, ChunkStatus requiredStatus) {
if (requiredStatus == ChunkStatus.EMPTY) {
return instance.getChunk(holder, requiredStatus);
} else {
return this.getChunkAt(requiredStatus.getPrevious(), instance)
.thenComposeAsync(
unused -> instance.getChunk(holder, requiredStatus),
Config.asyncScheduling ? Runnable::run : r -> {
final ThreadExecutor<Runnable> executor = ((IThreadedAnvilChunkStorage) instance).getMainThreadExecutor();
if (executor.isOnThread()) {
r.run();
} else {
executor.execute(r);
}
}
);
}
}

}
Expand Up @@ -5,6 +5,7 @@
"plugin": "com.ishland.c2me.base.common.ModuleMixinPlugin",
"mixins": [
"MixinChunkGenerator",
"MixinChunkHolder",
"MixinChunkRegion",
"MixinChunkStatus",
"MixinNoiseChunkGenerator",
Expand Down

0 comments on commit 1815657

Please sign in to comment.