1
0
mirror of https://github.com/LOOHP/Limbo.git synced 2026-06-07 21:41:43 +00:00

Performance improvements:

- Update dependencies
- Use blocking queue for Tick.asyncTasksQueue
- Do not call removed method Thread#stop in Tick#waitAndKillThreads
- Use virtual threads for ClientConnection
- Add build action

Signed-off-by: Joshua Castle <26531652+Kas-tle@users.noreply.github.com>
This commit is contained in:
Joshua Castle
2025-08-16 00:54:38 -07:00
parent 94ad6d8460
commit 7d9ef7f927
8 changed files with 101 additions and 68 deletions
+1 -1
View File
@@ -118,7 +118,7 @@ public class Console implements CommandSender {
reader.setExpandEvents(false);
reader.setHandleUserInterrupt(false);
terminal = TerminalBuilder.builder().streams(in, out).system(true).jansi(true).build();
terminal = TerminalBuilder.builder().streams(in, out).jansi(true).build();
tabReader = LineReaderBuilder.builder().terminal(terminal).completer(new Completer() {
@Override
public void complete(LineReader reader, ParsedLine line, List<Candidate> candidates) {
@@ -149,15 +149,18 @@ import java.util.TimerTask;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
public class ClientConnection extends Thread {
public class ClientConnection implements Runnable {
private static final Key DEFAULT_HANDLER_NAMESPACE = Key.key("default");
private static final String BRAND_ANNOUNCE_CHANNEL = Key.key("brand").toString();
private final Random random = new Random();
private final Socket clientSocket;
private final Lock packetSendLock = new ReentrantLock();
protected Channel channel;
private boolean running;
private volatile ClientState state;
@@ -232,9 +235,14 @@ public class ClientConnection extends Thread {
sendPacket(packet);
}
public synchronized void sendPacket(PacketOut packet) throws IOException {
if (channel.writePacket(packet)) {
setLastPacketTimestamp(System.currentTimeMillis());
public void sendPacket(PacketOut packet) throws IOException {
packetSendLock.lock();
try {
if (channel.writePacket(packet)) {
setLastPacketTimestamp(System.currentTimeMillis());
}
} finally {
packetSendLock.unlock();
}
}
@@ -27,12 +27,15 @@ import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ServerConnection extends Thread {
private final String ip;
private final int port;
private final boolean silent;
private final ExecutorService virtualThreadExecutor = Executors.newVirtualThreadPerTaskExecutor();
private ServerSocket serverSocket;
private List<ClientConnection> clients;
@@ -53,9 +56,9 @@ public class ServerConnection extends Thread {
}
while (true) {
Socket connection = serverSocket.accept();
ClientConnection sc = new ClientConnection(connection);
clients.add(sc);
sc.start();
ClientConnection clientTask = new ClientConnection(connection);
clients.add(clientTask);
virtualThreadExecutor.submit(clientTask);
}
} catch(IOException e) {
e.printStackTrace();
@@ -26,8 +26,8 @@ import com.loohp.limbo.scheduler.LimboScheduler.LimboSchedulerTask;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
@@ -37,7 +37,7 @@ public class Tick {
private AtomicLong tick = new AtomicLong(0);
private List<Thread> threads = new ArrayList<>();
private Queue<LimboSchedulerTask> asyncTasksQueue = new ConcurrentLinkedQueue<>();
private BlockingQueue<LimboSchedulerTask> asyncTasksQueue = new LinkedBlockingQueue<>();
public Tick(Limbo instance) {
new Thread(() -> {
@@ -46,22 +46,19 @@ public class Tick {
for (int i = 0; i < 4; i++) {
Thread thread = new Thread(() -> {
while (instance.isRunning()) {
LimboSchedulerTask task = asyncTasksQueue.poll();
if (task == null) {
try {
TimeUnit.NANOSECONDS.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
LimboTask limboTask = task.getTask();
try {
limboTask.run();
} catch (Throwable e) {
System.err.println("Task " + task.getTaskId() + " threw an exception: " + e.getLocalizedMessage());
e.printStackTrace();
}
}
try {
LimboSchedulerTask task = asyncTasksQueue.take();
LimboTask limboTask = task.getTask();
try {
limboTask.run();
} catch (Throwable e) {
System.err.println("Task " + task.getTaskId() + " threw an exception: " + e.getLocalizedMessage());
e.printStackTrace();
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
}
}
});
thread.start();
@@ -124,7 +121,6 @@ public class Tick {
return tick.get();
}
@SuppressWarnings("deprecation")
public void waitAndKillThreads(long waitTime) {
long end = System.currentTimeMillis() + waitTime;
for (Thread thread : threads) {
@@ -133,9 +129,6 @@ public class Tick {
} catch (InterruptedException e) {
e.printStackTrace();
}
if (thread.isAlive()) {
thread.stop();
}
}
}
@@ -97,7 +97,7 @@ public class Schematic {
CompoundTag heightMap = new CompoundTag();
heightMap.putLongArray("MOTION_BLOCKING", new long[] {1371773531765642314L,1389823183635651148L,1371738278539598925L,1389823183635388492L,1353688558756731469L,1389823114781694027L,1317765589597723213L,1371773531899860042L,1389823183635651149L,1371773462911685197L,1389823183635650636L,1353688626805119565L,1371773531900123211L,1335639250618849869L,1371738278674077258L,1389823114781694028L,1353723811310638154L,1371738278674077259L,1335674228429068364L,1335674228429067338L,1335674228698027594L,1317624576693539402L,1335709481520370249L,1299610178184057417L,1335638906349064264L,1299574993811968586L,1299574924958011464L,1299610178184056904L,1299574924958011464L,1299610109330100296L,1299574924958011464L,1299574924823793736L,1299574924958011465L,1281525273222484040L,1299574924958011464L,1281525273222484040L,9548107335L});
chunk.setHeightMaps(heightMap);
chunk.setBiomes(new int[256]);
chunk.setBiomes(new int[1024]);
chunk.cleanupPalettesAndBlockStates();
}
}
@@ -64,7 +64,7 @@ public class World {
EMPTY_CHUNK.cleanupPalettesAndBlockStates();
EMPTY_CHUNK.setHeightMaps(HEIGHT_MAP.clone());
EMPTY_CHUNK.setBiomes(new int[256]);
EMPTY_CHUNK.setBiomes(new int[1024]);
EMPTY_CHUNK.setTileEntities(new ListTag<>(CompoundTag.class));
}
@@ -90,7 +90,7 @@ public class World {
Chunk chunk = chunks[x][z];
chunk.cleanupPalettesAndBlockStates();
chunk.setHeightMaps(HEIGHT_MAP.clone());
chunk.setBiomes(new int[256]);
chunk.setBiomes(new int[1024]);
chunk.setTileEntities(new ListTag<>(CompoundTag.class));
}
}