Reduce tick buffer copy overhead

This commit is contained in:
TheMode 2021-04-20 08:54:33 +02:00
parent 66513025c7
commit 3fa89737d9
2 changed files with 14 additions and 16 deletions

View File

@ -71,10 +71,7 @@ public class ClientChannel extends SimpleChannelInboundHandler<InboundPacket> {
// Release tick buffer
if (playerConnection instanceof NettyPlayerConnection) {
final ByteBuf tickBuffer = ((NettyPlayerConnection) playerConnection).getTickBuffer();
synchronized (tickBuffer) {
tickBuffer.release();
}
((NettyPlayerConnection) playerConnection).releaseTickBuffer();
}
}
}

View File

@ -62,7 +62,8 @@ public class NettyPlayerConnection extends PlayerConnection {
private PlayerSkin bungeeSkin;
private final static int INITIAL_BUFFER_SIZE = 65_535; // 2^16-1
private final ByteBuf tickBuffer = BufUtils.getBuffer(true);
private final Object tickBufferLock = new Object();
private volatile ByteBuf tickBuffer = BufUtils.getBuffer(true);
public NettyPlayerConnection(@NotNull SocketChannel channel) {
super();
@ -119,7 +120,7 @@ public class NettyPlayerConnection extends PlayerConnection {
if (getPlayer() != null) {
// Flush happen during #update()
if (serverPacket instanceof CacheablePacket && MinecraftServer.hasPacketCaching()) {
synchronized (tickBuffer) {
synchronized (tickBufferLock) {
if (tickBuffer.refCnt() == 0)
return;
CacheablePacket.writeCache(tickBuffer, serverPacket);
@ -141,7 +142,7 @@ public class NettyPlayerConnection extends PlayerConnection {
public void write(@NotNull Object message, boolean skipTranslating) {
if (message instanceof FramedPacket) {
final FramedPacket framedPacket = (FramedPacket) message;
synchronized (tickBuffer) {
synchronized (tickBufferLock) {
if (tickBuffer.refCnt() == 0)
return;
final ByteBuf body = framedPacket.getBody();
@ -155,14 +156,14 @@ public class NettyPlayerConnection extends PlayerConnection {
serverPacket = ((ComponentHoldingServerPacket) serverPacket).copyWithOperator(component -> AdventureSerializer.translate(component, getPlayer()));
}
synchronized (tickBuffer) {
synchronized (tickBufferLock) {
if (tickBuffer.refCnt() == 0)
return;
PacketUtils.writeFramedPacket(tickBuffer, serverPacket);
}
return;
} else if (message instanceof ByteBuf) {
synchronized (tickBuffer) {
synchronized (tickBufferLock) {
if (tickBuffer.refCnt() == 0)
return;
tickBuffer.writeBytes((ByteBuf) message);
@ -193,11 +194,11 @@ public class NettyPlayerConnection extends PlayerConnection {
// Retrieve safe copy
final ByteBuf copy;
synchronized (tickBuffer) {
synchronized (tickBufferLock) {
if (tickBuffer.refCnt() == 0)
return;
copy = tickBuffer.copy();
tickBuffer.clear();
copy = tickBuffer;
tickBuffer = tickBuffer.alloc().buffer(tickBuffer.writerIndex());
}
// Write copied buffer to netty
@ -379,10 +380,10 @@ public class NettyPlayerConnection extends PlayerConnection {
}
}
@NotNull
public ByteBuf getTickBuffer() {
return tickBuffer;
public void releaseTickBuffer() {
synchronized (tickBufferLock) {
tickBuffer.release();
}
}
public byte[] getNonce() {