mirror of
https://github.com/Minestom/Minestom.git
synced 2024-10-01 07:57:41 +02:00
Async flush (#492)
This commit is contained in:
parent
13a8a22546
commit
06189ee783
@ -9,6 +9,7 @@ import net.minestom.server.network.ConnectionManager;
|
|||||||
import net.minestom.server.thread.MinestomThread;
|
import net.minestom.server.thread.MinestomThread;
|
||||||
import net.minestom.server.thread.ThreadDispatcher;
|
import net.minestom.server.thread.ThreadDispatcher;
|
||||||
import net.minestom.server.utils.PacketUtils;
|
import net.minestom.server.utils.PacketUtils;
|
||||||
|
import net.minestom.server.utils.async.AsyncUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -184,8 +185,10 @@ public final class UpdateManager {
|
|||||||
|
|
||||||
// Flush all waiting packets
|
// Flush all waiting packets
|
||||||
PacketUtils.flush();
|
PacketUtils.flush();
|
||||||
connectionManager.getOnlinePlayers().parallelStream().forEach(player ->
|
AsyncUtils.runAsync(() -> MinecraftServer.getConnectionManager()
|
||||||
player.getPlayerConnection().flush());
|
.getOnlinePlayers()
|
||||||
|
.parallelStream()
|
||||||
|
.forEach(player -> player.getPlayerConnection().flush()));
|
||||||
|
|
||||||
// the time that the tick took in nanoseconds
|
// the time that the tick took in nanoseconds
|
||||||
final long tickTime = System.nanoTime() - currentTime;
|
final long tickTime = System.nanoTime() - currentTime;
|
||||||
|
@ -75,6 +75,7 @@ public class PlayerSocketConnection extends PlayerConnection {
|
|||||||
private PlayerSkin bungeeSkin;
|
private PlayerSkin bungeeSkin;
|
||||||
|
|
||||||
private final Object bufferLock = new Object();
|
private final Object bufferLock = new Object();
|
||||||
|
private final Object flushLock = new Object();
|
||||||
private final List<BinaryBuffer> waitingBuffers = new ArrayList<>();
|
private final List<BinaryBuffer> waitingBuffers = new ArrayList<>();
|
||||||
private final AtomicReference<BinaryBuffer> tickBuffer = new AtomicReference<>(PooledBuffers.get());
|
private final AtomicReference<BinaryBuffer> tickBuffer = new AtomicReference<>(PooledBuffers.get());
|
||||||
private volatile BinaryBuffer cacheBuffer;
|
private volatile BinaryBuffer cacheBuffer;
|
||||||
@ -246,20 +247,14 @@ public class PlayerSocketConnection extends PlayerConnection {
|
|||||||
final int capacity = localBuffer.capacity();
|
final int capacity = localBuffer.capacity();
|
||||||
final int size = buffer.remaining();
|
final int size = buffer.remaining();
|
||||||
if (size <= capacity) {
|
if (size <= capacity) {
|
||||||
if (!localBuffer.canWrite(size)) {
|
if (!localBuffer.canWrite(size)) localBuffer = updateLocalBuffer();
|
||||||
flush();
|
|
||||||
localBuffer = tickBuffer.getPlain();
|
|
||||||
}
|
|
||||||
localBuffer.write(buffer);
|
localBuffer.write(buffer);
|
||||||
} else {
|
} else {
|
||||||
final int bufferCount = size / capacity + 1;
|
final int bufferCount = size / capacity + 1;
|
||||||
for (int i = 0; i < bufferCount; i++) {
|
for (int i = 0; i < bufferCount; i++) {
|
||||||
buffer.position(i * capacity);
|
buffer.position(i * capacity);
|
||||||
buffer.limit(Math.min(size, buffer.position() + capacity));
|
buffer.limit(Math.min(size, buffer.position() + capacity));
|
||||||
if (!localBuffer.canWrite(buffer.remaining())) {
|
if (!localBuffer.canWrite(buffer.remaining())) localBuffer = updateLocalBuffer();
|
||||||
flush();
|
|
||||||
localBuffer = tickBuffer.getPlain();
|
|
||||||
}
|
|
||||||
localBuffer.write(buffer);
|
localBuffer.write(buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -281,19 +276,10 @@ public class PlayerSocketConnection extends PlayerConnection {
|
|||||||
public void flush() {
|
public void flush() {
|
||||||
try {
|
try {
|
||||||
synchronized (bufferLock) {
|
synchronized (bufferLock) {
|
||||||
final BinaryBuffer localBuffer = tickBuffer.getPlain();
|
updateLocalBuffer();
|
||||||
final boolean emptyWaitingList = waitingBuffers.isEmpty();
|
}
|
||||||
if (localBuffer.readableBytes() == 0 && emptyWaitingList) return;
|
synchronized (flushLock) {
|
||||||
try {
|
try {
|
||||||
// Try to write the current buffer
|
|
||||||
if (emptyWaitingList && localBuffer.writeChannel(channel)) {
|
|
||||||
// Can reuse buffer
|
|
||||||
localBuffer.clear();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this.tickBuffer.setPlain(PooledBuffers.get());
|
|
||||||
this.waitingBuffers.add(localBuffer);
|
|
||||||
if (emptyWaitingList) return;
|
|
||||||
// Write as much as possible from the waiting list
|
// Write as much as possible from the waiting list
|
||||||
Iterator<BinaryBuffer> iterator = waitingBuffers.iterator();
|
Iterator<BinaryBuffer> iterator = waitingBuffers.iterator();
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
@ -316,6 +302,15 @@ public class PlayerSocketConnection extends PlayerConnection {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BinaryBuffer updateLocalBuffer() {
|
||||||
|
synchronized (flushLock) {
|
||||||
|
BinaryBuffer newBuffer = PooledBuffers.get();
|
||||||
|
this.waitingBuffers.add(tickBuffer.getPlain());
|
||||||
|
this.tickBuffer.setPlain(newBuffer);
|
||||||
|
return newBuffer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull SocketAddress getRemoteAddress() {
|
public @NotNull SocketAddress getRemoteAddress() {
|
||||||
return remoteAddress;
|
return remoteAddress;
|
||||||
|
Loading…
Reference in New Issue
Block a user