Optimise WorldWorkerManager (#10578)

This commit is contained in:
Paint_Ninja authored and GitHub committed 2025-07-23 18:37:02 +01:00
1 parent 837c259668
commit e80c3402b7
2 files changed
+40 -42

No files matched your search

@@ -19,7 +19,6 @@ import net.minecraftforge.event.entity.player.PlayerEvent;
import net.minecraftforge.event.level.ChunkEvent;
import net.minecraftforge.event.network.ConnectionStartEvent;
import net.minecraftforge.event.server.ServerStoppingEvent;
import net.minecraftforge.event.TickEvent.ServerTickEvent;
import net.minecraftforge.eventbus.api.bus.BusGroup;
import net.minecraftforge.eventbus.api.listener.Priority;
import net.minecraftforge.eventbus.api.listener.SubscribeEvent;
@@ -59,16 +58,6 @@ public final class ForgeInternalHandler {
return false;
}
@SubscribeEvent
static void onServerTick(ServerTickEvent.Pre event) {
WorldWorkerManager.tick(true);
}
@SubscribeEvent
static void onServerTick(ServerTickEvent.Post event) {
WorldWorkerManager.tick(false);
}
// @SubscribeEvent
// static void checkSettings(ClientTickEvent event) {
// if (event.phase == Phase.END)
@@ -5,73 +5,82 @@
package net.minecraftforge.common;
import java.util.ArrayList;
import java.util.List;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.listener.EventListener;
public class WorldWorkerManager
{
private static final List<IWorker> workers = new ArrayList<>();
import java.util.ArrayList;
public class WorldWorkerManager {
private static final ArrayList<IWorker> workers = new ArrayList<>();
private static long startTime = -1;
private static int index = 0;
private static EventListener tickStartListener;
private static EventListener tickEndListener;
public static void tick(boolean start)
{
if (start)
{
startTime = System.currentTimeMillis();
return;
}
private static void startTick() {
startTime = System.currentTimeMillis();
}
private static void endTick() {
index = 0;
IWorker task = getNext();
if (task == null)
if (task == null) {
clear();
return;
}
long time = 50 - (System.currentTimeMillis() - startTime);
if (time < 10)
time = 10; //If ticks are lagging, give us at least 10ms to do something.
time += System.currentTimeMillis();
while (System.currentTimeMillis() < time && task != null)
{
while (System.currentTimeMillis() < time && task != null) {
boolean again = task.doWork();
if (!task.hasWork())
{
if (!task.hasWork()) {
remove(task);
task = getNext();
}
else if (!again)
{
} else if (!again) {
task = getNext();
}
}
}
public static synchronized void addWorker(IWorker worker)
{
workers.add(worker);
@Deprecated(forRemoval = true, since = "1.21.8")
public static void tick(boolean start) {
if (start) startTick();
else endTick();
}
private static synchronized IWorker getNext()
{
public static synchronized void addWorker(IWorker worker) {
workers.add(worker);
if (tickStartListener == null) {
tickStartListener = TickEvent.ServerTickEvent.Pre.BUS.addListener(event -> startTick());
tickEndListener = TickEvent.ServerTickEvent.Post.BUS.addListener(event -> endTick());
}
}
private static synchronized IWorker getNext() {
return workers.size() > index ? workers.get(index++) : null;
}
private static synchronized void remove(IWorker worker)
{
private static synchronized void remove(IWorker worker) {
workers.remove(worker);
index--;
}
//Internal only, used to clear everything when the server shuts down.
public static synchronized void clear()
{
public static synchronized void clear() {
workers.clear();
if (tickStartListener != null) {
TickEvent.ServerTickEvent.Pre.BUS.removeListener(tickStartListener);
TickEvent.ServerTickEvent.Post.BUS.removeListener(tickEndListener);
tickStartListener = null;
tickEndListener = null;
}
}
public static interface IWorker
{
public interface IWorker {
boolean hasWork();
/**