From 0f5bb0e4f2858fa8fbcd3745376367bb11b4899f Mon Sep 17 00:00:00 2001 From: Eoghanmc22 Date: Thu, 25 Mar 2021 10:44:02 -0400 Subject: [PATCH] Changes to networking --- prismarine-minecraft-data | 2 +- .../network/netty/codec/PacketCompressor.java | 4 +-- .../network/player/NettyPlayerConnection.java | 9 ++++-- .../minestom/server/utils/PacketUtils.java | 29 ++++++++++--------- 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/prismarine-minecraft-data b/prismarine-minecraft-data index 424c41d75..2b25cb297 160000 --- a/prismarine-minecraft-data +++ b/prismarine-minecraft-data @@ -1 +1 @@ -Subproject commit 424c41d75e375c749640d608b9a3ae3c9592a25e +Subproject commit 2b25cb297bdad56a0673ab54f2a631a9808ea3b6 diff --git a/src/main/java/net/minestom/server/network/netty/codec/PacketCompressor.java b/src/main/java/net/minestom/server/network/netty/codec/PacketCompressor.java index ebee11ebc..9dcc77125 100644 --- a/src/main/java/net/minestom/server/network/netty/codec/PacketCompressor.java +++ b/src/main/java/net/minestom/server/network/netty/codec/PacketCompressor.java @@ -34,8 +34,6 @@ public class PacketCompressor extends ByteToMessageCodec { private final int threshold; - private final byte[] buffer = new byte[8192]; - private final Deflater deflater = new Deflater(3); private final Inflater inflater = new Inflater(); @@ -45,7 +43,7 @@ public class PacketCompressor extends ByteToMessageCodec { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf from, ByteBuf to) { - PacketUtils.compressBuffer(deflater, buffer, from, to); + PacketUtils.compressBuffer(deflater, from, to); } @Override diff --git a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java index 5347fe5e5..053fe23a0 100644 --- a/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java +++ b/src/main/java/net/minestom/server/network/player/NettyPlayerConnection.java @@ -143,9 +143,13 @@ public class NettyPlayerConnection extends PlayerConnection { timestamp > timedBuffer.getTimestamp(); if (shouldUpdate) { - final ByteBuf buffer = PacketUtils.createFramedPacket(serverPacket, false); + final ByteBuf buffer = PacketUtils.createFramedPacket(serverPacket, true); + TimedBuffer oldBuffer = timedBuffer; timedBuffer = new TimedBuffer(buffer, timestamp); temporaryCache.cache(identifier, timedBuffer); + if (oldBuffer != null) { + oldBuffer.getBuffer().release(); + } } write(new FramedPacket(timedBuffer.getBuffer())); @@ -172,8 +176,9 @@ public class NettyPlayerConnection extends PlayerConnection { } else if (message instanceof ServerPacket) { final ServerPacket serverPacket = (ServerPacket) message; synchronized (tickBuffer) { - final ByteBuf framedPacket = PacketUtils.createFramedPacket(serverPacket, false); + final ByteBuf framedPacket = PacketUtils.createFramedPacket(serverPacket, true); tickBuffer.writeBytes(framedPacket); + framedPacket.release(); } return; } else if (message instanceof ByteBuf) { diff --git a/src/main/java/net/minestom/server/utils/PacketUtils.java b/src/main/java/net/minestom/server/utils/PacketUtils.java index 3fa5eeb07..97ef80ac3 100644 --- a/src/main/java/net/minestom/server/utils/PacketUtils.java +++ b/src/main/java/net/minestom/server/utils/PacketUtils.java @@ -158,29 +158,31 @@ public final class PacketUtils { * @param packetBuffer the buffer containing all the packet fields * @param compressionTarget the buffer which will receive the compressed version of {@code packetBuffer} */ - public static void compressBuffer(@NotNull Deflater deflater, @Nullable byte[] buffer, - @NotNull ByteBuf packetBuffer, @NotNull ByteBuf compressionTarget) { + public static void compressBuffer(@NotNull Deflater deflater, @NotNull ByteBuf packetBuffer, @NotNull ByteBuf compressionTarget) { final int packetLength = packetBuffer.readableBytes(); final boolean compression = packetLength > MinecraftServer.getCompressionThreshold(); Utils.writeVarIntBuf(compressionTarget, compression ? packetLength : 0); if (compression) { - compress(deflater, buffer, packetBuffer, compressionTarget); + compress(deflater, packetBuffer, compressionTarget); } else { compressionTarget.writeBytes(packetBuffer); } } - private static void compress(@NotNull Deflater deflater, @Nullable byte[] buffer, - @NotNull ByteBuf uncompressed, @NotNull ByteBuf compressed) { - // Allocate buffer if not already - byte[] output = buffer != null ? buffer : new byte[8192]; + private static void compress(@NotNull Deflater deflater, @NotNull ByteBuf uncompressed, @NotNull ByteBuf compressed) { deflater.setInput(uncompressed.nioBuffer()); deflater.finish(); while (!deflater.finished()) { - final int length = deflater.deflate(output); - compressed.writeBytes(output, 0, length); + compressed.writerIndex( + deflater.deflate(compressed.nioBuffer(compressed.writerIndex(), compressed.writableBytes())) + + compressed.writerIndex() + ); + + if (compressed.writableBytes() == 0) { + compressed.ensureWritable(8192); + } } deflater.reset(); @@ -197,7 +199,7 @@ public final class PacketUtils { */ @NotNull public static ByteBuf createFramedPacket(@NotNull ServerPacket serverPacket, boolean directBuffer) { - ByteBuf packetBuf = Unpooled.buffer(); + ByteBuf packetBuf = directBuffer ? BufUtils.getBuffer(true) : Unpooled.buffer(); writePacket(packetBuf, serverPacket); final int dataLength = packetBuf.readableBytes(); @@ -211,18 +213,19 @@ public final class PacketUtils { ByteBuf compressedBuf = directBuffer ? BufUtils.getBuffer(true) : Unpooled.buffer(); Utils.writeVarIntBuf(compressedBuf, dataLength); final Deflater deflater = DEFLATER.get(); - compress(deflater, null, packetBuf, compressedBuf); + compress(deflater, packetBuf, compressedBuf); + packetBuf.release(); packetBuf = compressedBuf; } else { // Packet too small - ByteBuf uncompressedLengthBuffer = Unpooled.buffer(); + ByteBuf uncompressedLengthBuffer = directBuffer ? BufUtils.getBuffer(true, 1) : Unpooled.buffer(); Utils.writeVarIntBuf(uncompressedLengthBuffer, 0); packetBuf = Unpooled.wrappedBuffer(uncompressedLengthBuffer, packetBuf); } } // Write the final length of the packet - ByteBuf packetLengthBuffer = Unpooled.buffer(); + ByteBuf packetLengthBuffer = directBuffer ? BufUtils.getBuffer(true, 5) : Unpooled.buffer(); Utils.writeVarIntBuf(packetLengthBuffer, packetBuf.readableBytes()); return Unpooled.wrappedBuffer(packetLengthBuffer, packetBuf);