From 84b4069f7bcce2e5238eef13a16c9fb84cd95325 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Fri, 9 Jul 2021 13:40:31 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20object=20pool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mc/protocol/buffer/NetByteBuf.java | 15 +------ .../handler/ProtocolInboundHandler.java | 5 +-- .../handler/codec/ProtocolDecoder.java | 11 +++--- .../handler/codec/ProtocolEncoder.java | 9 ++--- .../handler/codec/ProtocolSplitter.java | 6 +-- .../client/CPlayerPositionAndLookPacket.java | 8 ++-- .../packets/play/client/PlayerLookPacket.java | 4 +- .../play/client/PlayerPositionPacket.java | 4 +- .../packets/play/server/ChunkDataPacket.java | 24 ++++-------- .../protocol/pool/NetByteBufObjectPool.java | 39 +++++++++++++++++++ .../mc/protocol/pool/PooledNetByteBuf.java | 18 +++++++++ .../mc/protocol/pool/ProtocolObjectPool.java | 32 +++++++++------ .../mc/protocol/pool/UnpooledNetByteBuf.java | 11 ++++++ utils/build.gradle | 2 +- .../pool/PassivablePooledObjectFactory.java | 4 +- 15 files changed, 121 insertions(+), 71 deletions(-) create mode 100644 protocol/src/main/java/mc/protocol/pool/NetByteBufObjectPool.java create mode 100644 protocol/src/main/java/mc/protocol/pool/PooledNetByteBuf.java create mode 100644 protocol/src/main/java/mc/protocol/pool/UnpooledNetByteBuf.java diff --git a/protocol/src/main/java/mc/protocol/buffer/NetByteBuf.java b/protocol/src/main/java/mc/protocol/buffer/NetByteBuf.java index ec865ea..6ef6da0 100644 --- a/protocol/src/main/java/mc/protocol/buffer/NetByteBuf.java +++ b/protocol/src/main/java/mc/protocol/buffer/NetByteBuf.java @@ -8,7 +8,6 @@ import lombok.experimental.Delegate; import lombok.extern.slf4j.Slf4j; import mc.protocol.model.text.Text; import mc.protocol.model.text.TextSerializer; -import mc.utils.pool.Passivable; import java.nio.charset.StandardCharsets; import java.util.UUID; @@ -49,15 +48,10 @@ import java.util.UUID; @RequiredArgsConstructor @EqualsAndHashCode(callSuper = false) @ToString -public class NetByteBuf extends ByteBuf implements Passivable { +public abstract class NetByteBuf extends ByteBuf { @Delegate - private ByteBuf byteBuf; - - public NetByteBuf setByteBuf(ByteBuf byteBuf) { - this.byteBuf = byteBuf; - return this; - } + protected ByteBuf byteBuf; public void writeUnsignedByte(int value) { byteBuf.writeByte((byte)(value & 0xFF)); @@ -181,11 +175,6 @@ public class NetByteBuf extends ByteBuf implements Passivable { } //endregion - @Override - public void passivate() { - this.byteBuf = null; - } - public static int readVarInt(ByteBuf byteBuf) { int numRead = 0; int result = 0; diff --git a/protocol/src/main/java/mc/protocol/handler/ProtocolInboundHandler.java b/protocol/src/main/java/mc/protocol/handler/ProtocolInboundHandler.java index a535a90..c3a800e 100644 --- a/protocol/src/main/java/mc/protocol/handler/ProtocolInboundHandler.java +++ b/protocol/src/main/java/mc/protocol/handler/ProtocolInboundHandler.java @@ -8,7 +8,6 @@ import mc.protocol.ProtocolAttributes; import mc.protocol.State; import mc.protocol.packets.ClientSidePacket; import mc.protocol.pool.ProtocolObjectPool; -import org.apache.commons.pool2.ObjectPool; import java.io.IOException; import java.util.Objects; @@ -22,11 +21,11 @@ public class ProtocolInboundHandler extends SimpleChannelInboundHandler out) throws Exception { + protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) { State state = Objects.requireNonNull(ctx.channel().attr(ProtocolAttributes.STATE).get()); - NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(in); + NetByteBuf netByteBuf = new UnpooledNetByteBuf(in); int packetId = netByteBuf.readVarInt(); Class packetClass = state.getClientSidePacketById(packetId); @@ -37,7 +38,7 @@ public class ProtocolDecoder extends ByteToMessageDecoder { log.warn("Unknown packet: State {} ; Id 0x{}", state, packetIdAsHexcode(packetId)); if (readUnknownPackets) { - UnknownPacket unknownPacket = ProtocolObjectPool.getPacketPool().borrowObject(UnknownPacket.class); + UnknownPacket unknownPacket = ProtocolObjectPool.packet().borrowObject(UnknownPacket.class); unknownPacket.setState(state); unknownPacket.setId(packetId); unknownPacket.setDataSize(netByteBuf.readableBytes()); @@ -47,15 +48,13 @@ public class ProtocolDecoder extends ByteToMessageDecoder { netByteBuf.skipBytes(netByteBuf.readableBytes()); } } else { - ClientSidePacket packet = ProtocolObjectPool.getPacketPool().borrowObject(packetClass); + ClientSidePacket packet = ProtocolObjectPool.packet().borrowObject(packetClass); packet.readSelf(netByteBuf); if (log.isDebugEnabled()) { log.debug("IN: {}:{}", state, packet); } out.add(packet); } - - ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf); } private static String packetIdAsHexcode(int packetId) { diff --git a/protocol/src/main/java/mc/protocol/handler/codec/ProtocolEncoder.java b/protocol/src/main/java/mc/protocol/handler/codec/ProtocolEncoder.java index b33693b..9a81319 100644 --- a/protocol/src/main/java/mc/protocol/handler/codec/ProtocolEncoder.java +++ b/protocol/src/main/java/mc/protocol/handler/codec/ProtocolEncoder.java @@ -9,7 +9,7 @@ import mc.protocol.ProtocolAttributes; import mc.protocol.State; import mc.protocol.buffer.NetByteBuf; import mc.protocol.packets.ServerSidePacket; -import mc.protocol.pool.ProtocolObjectPool; +import mc.protocol.pool.UnpooledNetByteBuf; import java.util.Objects; @@ -29,15 +29,12 @@ public class ProtocolEncoder extends MessageToByteEncoder { log.debug("OUT: {}:{}", state, packet); } - NetByteBuf buffer = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(Unpooled.buffer()); + NetByteBuf buffer = new UnpooledNetByteBuf(Unpooled.buffer()); buffer.writeVarInt(packetId); packet.writeSelf(buffer); - NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(out); + NetByteBuf netByteBuf = new UnpooledNetByteBuf(out); netByteBuf.writeVarInt(buffer.readableBytes()); netByteBuf.writeBytes(buffer); - - ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf); - ProtocolObjectPool.getNetByteBufPool().returnObject(buffer); } } diff --git a/protocol/src/main/java/mc/protocol/handler/codec/ProtocolSplitter.java b/protocol/src/main/java/mc/protocol/handler/codec/ProtocolSplitter.java index abb408b..e7b6145 100644 --- a/protocol/src/main/java/mc/protocol/handler/codec/ProtocolSplitter.java +++ b/protocol/src/main/java/mc/protocol/handler/codec/ProtocolSplitter.java @@ -5,7 +5,7 @@ import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.ByteToMessageDecoder; import mc.protocol.buffer.NetByteBuf; -import mc.protocol.pool.ProtocolObjectPool; +import mc.protocol.pool.UnpooledNetByteBuf; import java.util.List; @@ -13,7 +13,7 @@ public class ProtocolSplitter extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) { - NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(in); + NetByteBuf netByteBuf = new UnpooledNetByteBuf(in); netByteBuf.markReaderIndex(); do { @@ -37,7 +37,5 @@ public class ProtocolSplitter extends ByteToMessageDecoder { break; } } while (netByteBuf.readableBytes() > 0); - - ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf); } } diff --git a/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java b/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java index 3e9b3b6..f975ea7 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java @@ -43,20 +43,20 @@ public class CPlayerPositionAndLookPacket implements ClientSidePacket { double x = netByteBuf.readDouble(); double y = netByteBuf.readDouble(); double z = netByteBuf.readDouble(); - this.position = ProtocolObjectPool.getLocationPool().borrowObject().set(x, y, z); + this.position = ProtocolObjectPool.location().borrowObject().set(x, y, z); float yaw = netByteBuf.readFloat(); float pitch = netByteBuf.readFloat(); - this.look = ProtocolObjectPool.getLookPool().borrowObject().set(yaw, pitch); + this.look = ProtocolObjectPool.look().borrowObject().set(yaw, pitch); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { - ProtocolObjectPool.getLocationPool().returnObject(this.position); + ProtocolObjectPool.location().returnObject(this.position); this.position = null; - ProtocolObjectPool.getLookPool().returnObject(this.look); + ProtocolObjectPool.look().returnObject(this.look); this.look = null; this.onGround = false; } diff --git a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java index cff9cbf..513a65c 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java @@ -36,14 +36,14 @@ public class PlayerLookPacket implements ClientSidePacket { public void readSelf(NetByteBuf netByteBuf) { float yaw = netByteBuf.readFloat(); float pitch = netByteBuf.readFloat(); - this.look = ProtocolObjectPool.getLookPool().borrowObject().set(yaw, pitch); + this.look = ProtocolObjectPool.look().borrowObject().set(yaw, pitch); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { - ProtocolObjectPool.getLookPool().returnObject(this.look); + ProtocolObjectPool.look().returnObject(this.look); this.look = null; this.onGround = false; } diff --git a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java index 0a8bf1d..b8eaeb3 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java @@ -39,14 +39,14 @@ public class PlayerPositionPacket implements ClientSidePacket { double x = netByteBuf.readDouble(); double y = netByteBuf.readDouble(); double z = netByteBuf.readDouble(); - this.position = ProtocolObjectPool.getLocationPool().borrowObject().set(x, y, z); + this.position = ProtocolObjectPool.location().borrowObject().set(x, y, z); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { - ProtocolObjectPool.getLocationPool().returnObject(this.position); + ProtocolObjectPool.location().returnObject(this.position); this.position = null; this.onGround = false; } diff --git a/protocol/src/main/java/mc/protocol/packets/play/server/ChunkDataPacket.java b/protocol/src/main/java/mc/protocol/packets/play/server/ChunkDataPacket.java index b64be40..8399ff9 100644 --- a/protocol/src/main/java/mc/protocol/packets/play/server/ChunkDataPacket.java +++ b/protocol/src/main/java/mc/protocol/packets/play/server/ChunkDataPacket.java @@ -4,8 +4,7 @@ import io.netty.buffer.Unpooled; import lombok.Data; import mc.protocol.buffer.NetByteBuf; import mc.protocol.packets.ServerSidePacket; -import mc.utils.pool.ObjectPool; -import mc.protocol.pool.ProtocolObjectPool; +import mc.protocol.pool.UnpooledNetByteBuf; /** * Данные чанка. @@ -80,18 +79,16 @@ public class ChunkDataPacket implements ServerSidePacket { } static { - ObjectPool pool = ProtocolObjectPool.getNetByteBufPool(); - - voidData = pool.borrowObject().setByteBuf(Unpooled.buffer()); + voidData = new UnpooledNetByteBuf(Unpooled.buffer()); voidData.writeBoolean(true); // Is Full chunk voidData.writeVarInt(0b11111111); // Available Sections - NetByteBuf data = pool.borrowObject().setByteBuf(Unpooled.buffer()); + NetByteBuf data = new UnpooledNetByteBuf(Unpooled.buffer()); for (int i = 0; i < 16; i++) { - NetByteBuf dataBuff = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[4096])); - NetByteBuf blockLight = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[2048])); - NetByteBuf skyLight = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[2048])); - NetByteBuf biomes = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[256])); + NetByteBuf dataBuff = new UnpooledNetByteBuf(Unpooled.wrappedBuffer(new byte[4096])); + NetByteBuf blockLight = new UnpooledNetByteBuf(Unpooled.wrappedBuffer(new byte[2048])); + NetByteBuf skyLight = new UnpooledNetByteBuf(Unpooled.wrappedBuffer(new byte[2048])); + NetByteBuf biomes = new UnpooledNetByteBuf(Unpooled.wrappedBuffer(new byte[256])); data.writeUnsignedByte(13); data.writeUnsignedByte(0); @@ -100,11 +97,6 @@ public class ChunkDataPacket implements ServerSidePacket { data.writeBytes(blockLight); data.writeBytes(skyLight); data.writeBytes(biomes); - - pool.returnObject(biomes); - pool.returnObject(skyLight); - pool.returnObject(blockLight); - pool.returnObject(dataBuff); } voidData.writeVarInt(data.readableBytes()); @@ -113,7 +105,5 @@ public class ChunkDataPacket implements ServerSidePacket { voidData.markReaderIndex(); voidData.markWriterIndex(); - - pool.returnObject(data); } } diff --git a/protocol/src/main/java/mc/protocol/pool/NetByteBufObjectPool.java b/protocol/src/main/java/mc/protocol/pool/NetByteBufObjectPool.java new file mode 100644 index 0000000..6d6ff71 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/NetByteBufObjectPool.java @@ -0,0 +1,39 @@ +package mc.protocol.pool; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.PooledByteBufAllocator; +import lombok.SneakyThrows; +import mc.protocol.buffer.NetByteBuf; +import mc.utils.pool.ObjectPool; +import mc.utils.pool.PassivablePooledObjectFactory; +import org.apache.commons.pool2.impl.GenericObjectPool; + +@SuppressWarnings({ "rawtypes", "unchecked" }) +public class NetByteBufObjectPool implements ObjectPool { + + private final org.apache.commons.pool2.ObjectPool apacheObjectPool; + + NetByteBufObjectPool() { + this.apacheObjectPool = new GenericObjectPool<>(new PassivablePooledObjectFactory<>(PooledNetByteBuf.class)); + } + + @Override + public NetByteBuf borrowObject() { + return borrowObject(PooledByteBufAllocator.DEFAULT.buffer()); + } + + @SneakyThrows + public NetByteBuf borrowObject(ByteBuf byteBuf) { + PooledNetByteBuf pooledNetByteBuf = (PooledNetByteBuf) apacheObjectPool.borrowObject(); + pooledNetByteBuf.init(byteBuf); + return pooledNetByteBuf; + } + + @Override + @SneakyThrows + public void returnObject(NetByteBuf netByteBuf) { + if (netByteBuf instanceof PooledNetByteBuf) { + apacheObjectPool.returnObject(netByteBuf); + } + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/PooledNetByteBuf.java b/protocol/src/main/java/mc/protocol/pool/PooledNetByteBuf.java new file mode 100644 index 0000000..e9e26fa --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/PooledNetByteBuf.java @@ -0,0 +1,18 @@ +package mc.protocol.pool; + +import io.netty.buffer.ByteBuf; +import mc.protocol.buffer.NetByteBuf; +import mc.utils.pool.Passivable; + +public class PooledNetByteBuf extends NetByteBuf implements Passivable { + + void init(ByteBuf byteBuf) { + this.byteBuf = byteBuf; + } + + @Override + public void passivate() { + this.byteBuf.release(); + this.byteBuf = null; + } +} diff --git a/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java b/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java index 2c50852..f239447 100644 --- a/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java +++ b/protocol/src/main/java/mc/protocol/pool/ProtocolObjectPool.java @@ -1,26 +1,36 @@ package mc.protocol.pool; import lombok.AccessLevel; -import lombok.Getter; import lombok.NoArgsConstructor; -import mc.protocol.buffer.NetByteBuf; import mc.protocol.model.Location; import mc.protocol.model.Look; import mc.protocol.packets.ClientSidePacket; -import mc.utils.pool.*; +import mc.utils.pool.MultiObjectPool; +import mc.utils.pool.ObjectPool; +import mc.utils.pool.PassivableMultiObjectPool; +import mc.utils.pool.SimpleObjectPool; @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class ProtocolObjectPool { - @Getter private static final ObjectPool locationPool = new SimpleObjectPool<>(Location.class); - - @Getter private static final ObjectPool lookPool = new SimpleObjectPool<>(Look.class); - - @Getter - private static final ObjectPool netByteBufPool = new PassivableObjectPool<>(NetByteBuf.class); - - @Getter + private static final NetByteBufObjectPool netByteBufPool = new NetByteBufObjectPool(); private static final MultiObjectPool packetPool = new PassivableMultiObjectPool<>(); + + public static ObjectPool location() { + return locationPool; + } + + public static ObjectPool look() { + return lookPool; + } + + public static NetByteBufObjectPool netByteBuf() { + return netByteBufPool; + } + + public static MultiObjectPool packet() { + return packetPool; + } } diff --git a/protocol/src/main/java/mc/protocol/pool/UnpooledNetByteBuf.java b/protocol/src/main/java/mc/protocol/pool/UnpooledNetByteBuf.java new file mode 100644 index 0000000..06fcc57 --- /dev/null +++ b/protocol/src/main/java/mc/protocol/pool/UnpooledNetByteBuf.java @@ -0,0 +1,11 @@ +package mc.protocol.pool; + +import io.netty.buffer.ByteBuf; +import mc.protocol.buffer.NetByteBuf; + +public class UnpooledNetByteBuf extends NetByteBuf { + + public UnpooledNetByteBuf(ByteBuf byteBuf) { + this.byteBuf = byteBuf; + } +} diff --git a/utils/build.gradle b/utils/build.gradle index dc7b095..f1a96d2 100644 --- a/utils/build.gradle +++ b/utils/build.gradle @@ -1,5 +1,5 @@ apply from: rootDir.toPath().resolve('logic.gradle').toFile() dependencies { - implementation libs.objpool + api libs.objpool } \ No newline at end of file diff --git a/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java b/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java index f6eaff1..9e2a601 100644 --- a/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java +++ b/utils/src/main/java/mc/utils/pool/PassivablePooledObjectFactory.java @@ -2,9 +2,9 @@ package mc.utils.pool; import org.apache.commons.pool2.PooledObject; -class PassivablePooledObjectFactory extends SimplePooledObjectFactory { +public class PassivablePooledObjectFactory extends SimplePooledObjectFactory { - PassivablePooledObjectFactory(Class clazz) { + public PassivablePooledObjectFactory(Class clazz) { super(clazz); }