Skip to content

Commit

Permalink
Experimental: Optimize chunk iteration
Browse files Browse the repository at this point in the history
Also refactor chunk related packages
  • Loading branch information
ishland committed Oct 23, 2022
1 parent 3fc61f6 commit 7a2896c
Show file tree
Hide file tree
Showing 32 changed files with 136 additions and 69 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ishland.vmp.common.chunk.iteration;

import net.minecraft.server.world.ChunkHolder;

public interface ITickableChunkSource {

Iterable<ChunkHolder> vmp$tickableChunksIterator();

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ishland.vmp.common.chunk.loading;

public interface IEntityPortalInterface {

// default CompletionStage<TeleportTarget> getTeleportTargetAtAsync(ServerWorld destination) {
// throw new AbstractMethodError();
// }

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
package com.ishland.vmp.common.chunkloading;
package com.ishland.vmp.common.chunk.loading;

import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.WorldView;

import java.util.concurrent.CompletableFuture;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ishland.vmp.common.chunkloading.async_chunks_on_player_login;
package com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login;

import com.ibm.asyncutil.locks.AsyncSemaphore;
import com.ibm.asyncutil.locks.FairAsyncSemaphore;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ishland.vmp.common.chunkloading.async_chunks_on_player_login;
package com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login;

import net.minecraft.nbt.NbtCompound;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package com.ishland.vmp.common.chunk.loading;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package com.ishland.vmp.common.chunk;
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ishland.vmp.common.chunksending;
package com.ishland.vmp.common.chunk.sending;

import com.google.common.util.concurrent.RateLimiter;
import com.ishland.vmp.common.chunkwatching.PlayerClientVDTracking;
Expand All @@ -14,9 +14,6 @@
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
import it.unimi.dsi.fastutil.objects.Reference2ReferenceLinkedOpenHashMap;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.VersionParsingException;
import net.fabricmc.loader.api.metadata.version.VersionPredicate;
import net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ThreadedAnvilChunkStorage;
Expand All @@ -25,7 +22,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Field;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ishland.vmp.common.chunkwatching;

import com.ishland.vmp.common.chunksending.PlayerChunkSendingSystem;
import com.ishland.vmp.common.chunk.sending.PlayerChunkSendingSystem;
import com.ishland.vmp.common.maps.AreaMap;
import io.papermc.paper.util.MCUtil;
import it.unimi.dsi.fastutil.objects.Object2LongMap;
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/com/ishland/vmp/common/config/Config.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public class Config {
public static final int TARGET_CHUNK_SEND_RATE;
public static final boolean USE_PACKET_PRIORITY_SYSTEM;
public static final boolean USE_PACKET_PRIORITY_SYSTEM_BLOCK_UPDATE_CONSOLIDATION;
public static final boolean USE_OPTIMIZED_CHUNK_TICKING_ITERATION;
public static final boolean USE_ASYNC_LOGGING;
public static final boolean USE_OPTIMIZED_ENTITY_TRACKING;
public static final boolean USE_MULTIPLE_NETTY_EVENT_LOOPS;
Expand All @@ -37,6 +38,7 @@ public class Config {
TARGET_CHUNK_SEND_RATE = getInt(properties, newProperties, "target_chunk_send_rate", -1);
USE_PACKET_PRIORITY_SYSTEM = getBoolean(properties, newProperties, "use_packet_priority_system", true);
USE_PACKET_PRIORITY_SYSTEM_BLOCK_UPDATE_CONSOLIDATION = getBoolean(properties, newProperties, "exp_use_packet_priority_system_block_update_consolidation", false);
USE_OPTIMIZED_CHUNK_TICKING_ITERATION = getBoolean(properties, newProperties, "exp_use_optimized_chunk_ticking_iteration", false);
USE_ASYNC_LOGGING = getBoolean(properties, newProperties, "use_async_logging", true);
USE_OPTIMIZED_ENTITY_TRACKING = getBoolean(properties, newProperties, "use_optimized_entity_tracking", true);
USE_MULTIPLE_NETTY_EVENT_LOOPS = getBoolean(properties, newProperties, "use_multiple_netty_event_loops", true);
Expand Down
10 changes: 6 additions & 4 deletions src/main/java/com/ishland/vmp/mixins/VMPMixinPlugin.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ishland.vmp.mixins;

import com.ishland.vmp.common.chunksending.PlayerChunkSendingSystem;
import com.ishland.vmp.common.chunk.sending.PlayerChunkSendingSystem;
import com.ishland.vmp.common.config.Config;
import com.ishland.vmp.common.logging.AsyncAppenderBootstrap;
import net.fabricmc.loader.api.FabricLoader;
Expand All @@ -27,19 +27,21 @@ public String getRefMapperConfig() {
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
if (mixinClassName.startsWith("com.ishland.vmp.mixins.carpet."))
return FabricLoader.getInstance().isModLoaded("carpet");
if (mixinClassName.startsWith("com.ishland.vmp.mixins.chunksending."))
if (mixinClassName.startsWith("com.ishland.vmp.mixins.chunk.sending."))
return PlayerChunkSendingSystem.ENABLED;
if (mixinClassName.startsWith("com.ishland.vmp.mixins.playerwatching.optimize_nearby_entity_tracking_lookups"))
return Config.USE_OPTIMIZED_ENTITY_TRACKING;
if (mixinClassName.startsWith("com.ishland.vmp.mixins.networking.eventloops."))
return Config.USE_MULTIPLE_NETTY_EVENT_LOOPS;
if (mixinClassName.startsWith("com.ishland.vmp.mixins.chunkloading.portals."))
if (mixinClassName.startsWith("com.ishland.vmp.mixins.chunk.loading.portals."))
return Config.USE_ASYNC_PORTALS;
if (mixinClassName.startsWith("com.ishland.vmp.mixins.general.cache_ops.biome."))
return Config.PRECACHE_BIOME_LOOKUP;
if (mixinClassName.startsWith("com.ishland.vmp.mixins.networking.priority."))
return Config.USE_PACKET_PRIORITY_SYSTEM;
if (mixinClassName.startsWith("com.ishland.vmp.mixins.chunkloading.async_chunk_on_player_login"))
if (mixinClassName.startsWith("com.ishland.vmp.mixins.chunk.iteration."))
return Config.USE_OPTIMIZED_CHUNK_TICKING_ITERATION;
if (mixinClassName.startsWith("com.ishland.vmp.mixins.chunk.loading.async_chunk_on_player_login"))
return Config.USE_ASYNC_CHUNKS_ON_LOGIN && !isClassExist("com.ishland.c2me.opts.chunkio.common.async_chunk_on_player_login.IAsyncChunkPlayer");
if (mixinClassName.equals("com.ishland.vmp.mixins.playerwatching.MixinTACSCancelSendingKrypton"))
return FabricLoader.getInstance().isModLoaded("krypton");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.ishland.vmp.mixins.chunk.iteration;

import com.ishland.vmp.common.chunk.iteration.ITickableChunkSource;
import net.minecraft.server.world.ChunkHolder;
import net.minecraft.server.world.ServerChunkManager;
import net.minecraft.server.world.ThreadedAnvilChunkStorage;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

@Mixin(ServerChunkManager.class)
public class MixinServerChunkManager {

@Redirect(method = "tickChunks", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ThreadedAnvilChunkStorage;entryIterator()Ljava/lang/Iterable;"))
private Iterable<ChunkHolder> redirectVisibleChunks(ThreadedAnvilChunkStorage instance) {
return ((ITickableChunkSource) instance).vmp$tickableChunksIterator();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.ishland.vmp.mixins.chunk.iteration;

import com.ishland.vmp.common.chunk.iteration.ITickableChunkSource;
import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap;
import net.minecraft.server.world.ChunkHolder;
import net.minecraft.server.world.ThreadedAnvilChunkStorage;
import net.minecraft.util.math.ChunkPos;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(ThreadedAnvilChunkStorage.class)
public class MixinThreadedAnvilChunkStorage implements ITickableChunkSource {

@Shadow @Final private Long2ObjectLinkedOpenHashMap<ChunkHolder> currentChunkHolders;

@Unique
private Long2ObjectLinkedOpenHashMap<ChunkHolder> vmp$tickingChunks = new Long2ObjectLinkedOpenHashMap<>();

@Inject(method = "<init>", at = @At("RETURN"))
private void onInit(CallbackInfo ci) {
this.vmp$tickingChunks = new Long2ObjectLinkedOpenHashMap<>();
}

@Inject(method = "onChunkStatusChange", at = @At("HEAD"))
private void listenChunkStatusChange(ChunkPos chunkPos, ChunkHolder.LevelType levelType, CallbackInfo ci) {
final ChunkHolder chunkHolder = this.currentChunkHolders.get(chunkPos.toLong());
if (chunkHolder == null) return;
if (chunkHolder.getLevelType().isAfter(ChunkHolder.LevelType.TICKING)) {
this.vmp$tickingChunks.put(chunkPos.toLong(), chunkHolder);
} else {
this.vmp$tickingChunks.remove(chunkPos.toLong());
}
}

@Override
public Iterable<ChunkHolder> vmp$tickableChunksIterator() {
return this.vmp$tickingChunks.values();
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.ishland.vmp.mixins.chunkloading;
package com.ishland.vmp.mixins.chunk.loading;

import com.ishland.vmp.common.chunkloading.IPOIAsyncPreload;
import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.chunk.loading.IPOIAsyncPreload;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.mixins.access.IPointOfInterestSet;
import com.mojang.datafixers.DataFixer;
import com.mojang.datafixers.util.Pair;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ishland.vmp.mixins.chunkloading;
package com.ishland.vmp.mixins.chunk.loading;

import net.minecraft.util.math.Vec3d;
import net.minecraft.world.TeleportTarget;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.ishland.vmp.mixins.chunkloading.async_chunk_on_player_login;
package com.ishland.vmp.mixins.chunk.loading.async_chunk_on_player_login;

import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.IAsyncChunkPlayer;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.IAsyncChunkPlayer;
import com.ishland.vmp.mixins.access.IServerChunkManager;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.ishland.vmp.mixins.chunkloading.async_chunk_on_player_login;
package com.ishland.vmp.mixins.chunk.loading.async_chunk_on_player_login;

import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.IAsyncChunkPlayer;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.IAsyncChunkPlayer;
import com.ishland.vmp.common.config.Config;
import net.minecraft.network.ClientConnection;
import net.minecraft.network.packet.c2s.play.ClientStatusC2SPacket;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ishland.vmp.mixins.chunkloading.async_chunk_on_player_login;
package com.ishland.vmp.mixins.chunk.loading.async_chunk_on_player_login;

import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.IAsyncChunkPlayer;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.IAsyncChunkPlayer;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.server.network.ServerPlayerEntity;
import org.spongepowered.asm.mixin.Mixin;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ishland.vmp.mixins.chunkloading.commands;
package com.ishland.vmp.mixins.chunk.loading.commands;

import net.minecraft.server.command.CommandOutput;
import net.minecraft.server.command.ServerCommandSource;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.ishland.vmp.mixins.chunkloading.commands;
package com.ishland.vmp.mixins.chunk.loading.commands;

import com.google.common.collect.Maps;
import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.mixins.access.IServerCommandSource;
import com.ishland.vmp.mixins.access.ISpreadPlayersCommandPile;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
Expand All @@ -25,7 +25,6 @@
import net.minecraft.util.math.random.Random;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ishland.vmp.mixins.chunkloading.commands;
package com.ishland.vmp.mixins.chunk.loading.commands;

import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.mixins.access.IServerCommandSource;
import com.mojang.brigadier.exceptions.CommandSyntaxException;
import net.minecraft.command.argument.PosArgument;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package com.ishland.vmp.mixins.chunk.loading;
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package com.ishland.vmp.mixins.chunkloading.portals;
package com.ishland.vmp.mixins.chunk.loading.portals;

import com.ibm.asyncutil.iteration.AsyncIterator;
import com.ishland.vmp.common.chunkloading.IEntityPortalInterface;
import com.ishland.vmp.common.chunkloading.IPOIAsyncPreload;
import com.ishland.vmp.common.chunkloading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.chunk.loading.IEntityPortalInterface;
import com.ishland.vmp.common.chunk.loading.IPOIAsyncPreload;
import com.ishland.vmp.common.chunk.loading.async_chunks_on_player_login.AsyncChunkLoadUtil;
import com.ishland.vmp.common.config.Config;
import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
import net.minecraft.block.BlockState;
import net.minecraft.block.NetherPortalBlock;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityDimensions;
import net.minecraft.entity.EntityPose;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package com.ishland.vmp.mixins.chunk;
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.ishland.vmp.mixins.chunksending;
package com.ishland.vmp.mixins.chunk.sending;

import com.ishland.vmp.common.chunkwatching.AreaPlayerChunkWatchingManager;
import net.minecraft.network.packet.s2c.play.ChunkDataS2CPacket;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.ishland.vmp.mixins.chunksending.c2me_notickvd_compat;
package com.ishland.vmp.mixins.chunk.sending.c2me_notickvd_compat;

import com.ishland.vmp.common.chunksending.PlayerChunkSendingSystem;
import com.ishland.vmp.common.chunk.sending.PlayerChunkSendingSystem;
import com.ishland.vmp.common.chunkwatching.AreaPlayerChunkWatchingManager;
import com.ishland.vmp.mixins.access.IThreadedAnvilChunkStorage;
import net.minecraft.server.network.ServerPlayerEntity;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package com.ishland.vmp.mixins.chunk.sending;

This file was deleted.

This file was deleted.

24 changes: 13 additions & 11 deletions src/main/resources/vmp.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,19 @@
"access.IThreadedAnvilChunkStorage",
"access.IThreadedAnvilChunkStorageEntityTracker",
"carpet.MixinEntityPlayerMPFake",
"chunkloading.MixinPointOfInterestStorage",
"chunkloading.MixinTeleportTarget",
"chunkloading.async_chunk_on_player_login.MixinPlayerManager",
"chunkloading.async_chunk_on_player_login.MixinServerPlayerEntity",
"chunkloading.async_chunk_on_player_login.MixinServerPlayNetworkHandler",
"chunkloading.commands.MixinCommandFunctionManager",
"chunkloading.commands.MixinSpreadPlayersCommand",
"chunkloading.commands.MixinTeleportCommand",
"chunkloading.portals.MixinEntity",
"chunksending.MixinThreadedAnvilChunkStorage",
"chunksending.c2me_notickvd_compat.MixinNoTickChunkSendingInterceptor",
"chunk.iteration.MixinServerChunkManager",
"chunk.iteration.MixinThreadedAnvilChunkStorage",
"chunk.loading.MixinPointOfInterestStorage",
"chunk.loading.MixinTeleportTarget",
"chunk.loading.async_chunk_on_player_login.MixinPlayerManager",
"chunk.loading.async_chunk_on_player_login.MixinServerPlayerEntity",
"chunk.loading.async_chunk_on_player_login.MixinServerPlayNetworkHandler",
"chunk.loading.commands.MixinCommandFunctionManager",
"chunk.loading.commands.MixinSpreadPlayersCommand",
"chunk.loading.commands.MixinTeleportCommand",
"chunk.loading.portals.MixinEntity",
"chunk.sending.MixinThreadedAnvilChunkStorage",
"chunk.sending.c2me_notickvd_compat.MixinNoTickChunkSendingInterceptor",
"entity.iteration.MixinEntityTrackingSection",
"entity.move_zero_velocity.MixinEntity",
"entitytracker.MixinEntityTrackerEntry",
Expand Down

0 comments on commit 7a2896c

Please sign in to comment.