mirror of
https://github.com/MinecraftForge/MinecraftForge.git
synced 2026-11-12 00:07:45 +00:00
Optimise WorldWorkerManager (#10578)
This commit is contained in:
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();
|
||||
|
||||
/**
|
||||
|
||||
Reference in new issue
Block a user