From a5f68e76e55f6ff2618eac61e0d9e019e2c5198b Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Mon, 10 May 2021 03:58:31 +0300 Subject: [PATCH] refactoring: Pooled objects --- .../main/java/mc/protocol/model/Location.java | 22 ++++------- .../src/main/java/mc/protocol/model/Look.java | 9 ++++- .../client/CPlayerPositionAndLookPacket.java | 8 +++- .../packets/play/client/PlayerLookPacket.java | 4 +- .../play/client/PlayerPositionPacket.java | 4 +- .../mc/protocol/pool/LocationObjectPool.java | 37 +++++++++++++++++++ .../java/mc/protocol/pool/LookObjectPool.java | 37 +++++++++++++++++++ 7 files changed, 101 insertions(+), 20 deletions(-) create mode 100644 protocol-new/src/main/java/mc/protocol/pool/LocationObjectPool.java create mode 100644 protocol-new/src/main/java/mc/protocol/pool/LookObjectPool.java diff --git a/protocol-new/src/main/java/mc/protocol/model/Location.java b/protocol-new/src/main/java/mc/protocol/model/Location.java index 483db15..293ad86 100644 --- a/protocol-new/src/main/java/mc/protocol/model/Location.java +++ b/protocol-new/src/main/java/mc/protocol/model/Location.java @@ -1,24 +1,18 @@ package mc.protocol.model; -import lombok.AllArgsConstructor; import lombok.Data; -@AllArgsConstructor @Data public class Location { - private double x; - private double y; - private double z; + private double x = 0d; + private double y = 0d; + private double z = 0d; - public int getIntX() { - return (int) x; - } + public Location set(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; - public int getIntZ() { - return (int) z; - } - - public Location toChunkXZ() { - return new Location(this.getIntX() >> 4, 0d, this.getIntZ() >> 4); + return this; } } diff --git a/protocol-new/src/main/java/mc/protocol/model/Look.java b/protocol-new/src/main/java/mc/protocol/model/Look.java index b4b9d4d..334ad10 100644 --- a/protocol-new/src/main/java/mc/protocol/model/Look.java +++ b/protocol-new/src/main/java/mc/protocol/model/Look.java @@ -1,11 +1,16 @@ package mc.protocol.model; -import lombok.AllArgsConstructor; import lombok.Data; -@AllArgsConstructor @Data public class Look { private float yaw; private float pitch; + + public Look set(float yaw, float pitch) { + this.yaw = yaw; + this.pitch = pitch; + + return this; + } } diff --git a/protocol-new/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java b/protocol-new/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java index 8b5f801..f48b8d6 100644 --- a/protocol-new/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java +++ b/protocol-new/src/main/java/mc/protocol/packets/play/client/CPlayerPositionAndLookPacket.java @@ -8,6 +8,8 @@ import mc.protocol.io.NetByteBuf; import mc.protocol.model.Location; import mc.protocol.model.Look; import mc.protocol.packets.ClientSidePacket; +import mc.protocol.pool.LocationObjectPool; +import mc.protocol.pool.LookObjectPool; /** * Клиент сообщает о движении и повороте головы Игрока. @@ -42,18 +44,20 @@ public class CPlayerPositionAndLookPacket implements ClientSidePacket { double x = netByteBuf.readDouble(); double y = netByteBuf.readDouble(); double z = netByteBuf.readDouble(); - this.position = new Location(x, y, z); + this.position = LocationObjectPool.borrowObject().set(x, y, z); float yaw = netByteBuf.readFloat(); float pitch = netByteBuf.readFloat(); - this.look = new Look(yaw, pitch); + this.look = LookObjectPool.borrowObject().set(yaw, pitch); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { + LocationObjectPool.returnObject(this.position); this.position = null; + LookObjectPool.returnObject(this.look); this.look = null; this.onGround = false; } diff --git a/protocol-new/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java b/protocol-new/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java index 5d24ddc..91ff620 100644 --- a/protocol-new/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java +++ b/protocol-new/src/main/java/mc/protocol/packets/play/client/PlayerLookPacket.java @@ -7,6 +7,7 @@ import lombok.ToString; import mc.protocol.io.NetByteBuf; import mc.protocol.model.Look; import mc.protocol.packets.ClientSidePacket; +import mc.protocol.pool.LookObjectPool; /** * Клиент сообщает о повороте головы Игрока. @@ -35,13 +36,14 @@ public class PlayerLookPacket implements ClientSidePacket { public void readSelf(NetByteBuf netByteBuf) { float yaw = netByteBuf.readFloat(); float pitch = netByteBuf.readFloat(); - this.look = new Look(yaw, pitch); + this.look = LookObjectPool.borrowObject().set(yaw, pitch); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { + LookObjectPool.returnObject(this.look); this.look = null; this.onGround = false; } diff --git a/protocol-new/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java b/protocol-new/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java index 7939faa..ed44a02 100644 --- a/protocol-new/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java +++ b/protocol-new/src/main/java/mc/protocol/packets/play/client/PlayerPositionPacket.java @@ -7,6 +7,7 @@ import lombok.ToString; import mc.protocol.io.NetByteBuf; import mc.protocol.model.Location; import mc.protocol.packets.ClientSidePacket; +import mc.protocol.pool.LocationObjectPool; /** * Клиент сообщает о движении Игрока. @@ -38,13 +39,14 @@ public class PlayerPositionPacket implements ClientSidePacket { double x = netByteBuf.readDouble(); double y = netByteBuf.readDouble(); double z = netByteBuf.readDouble(); - this.position = new Location(x, y, z); + this.position = LocationObjectPool.borrowObject().set(x, y, z); this.onGround = netByteBuf.readBoolean(); } @Override public void passivate() { + LocationObjectPool.returnObject(this.position); this.position = null; this.onGround = false; } diff --git a/protocol-new/src/main/java/mc/protocol/pool/LocationObjectPool.java b/protocol-new/src/main/java/mc/protocol/pool/LocationObjectPool.java new file mode 100644 index 0000000..33b65a1 --- /dev/null +++ b/protocol-new/src/main/java/mc/protocol/pool/LocationObjectPool.java @@ -0,0 +1,37 @@ +package mc.protocol.pool; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import mc.protocol.model.Location; +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.ObjectPool; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; +import org.apache.commons.pool2.impl.GenericObjectPool; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LocationObjectPool extends BasePooledObjectFactory { + + private static final ObjectPool instance = new GenericObjectPool<>(new LocationObjectPool()); + + @Override + public Location create() { + return new Location(); + } + + @Override + public PooledObject wrap(Location location) { + return new DefaultPooledObject<>(location); + } + + @SneakyThrows + public static Location borrowObject() { + return instance.borrowObject(); + } + + @SneakyThrows + public static void returnObject(Location location) { + instance.returnObject(location); + } +} diff --git a/protocol-new/src/main/java/mc/protocol/pool/LookObjectPool.java b/protocol-new/src/main/java/mc/protocol/pool/LookObjectPool.java new file mode 100644 index 0000000..b557a90 --- /dev/null +++ b/protocol-new/src/main/java/mc/protocol/pool/LookObjectPool.java @@ -0,0 +1,37 @@ +package mc.protocol.pool; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; +import lombok.SneakyThrows; +import mc.protocol.model.Look; +import org.apache.commons.pool2.BasePooledObjectFactory; +import org.apache.commons.pool2.ObjectPool; +import org.apache.commons.pool2.PooledObject; +import org.apache.commons.pool2.impl.DefaultPooledObject; +import org.apache.commons.pool2.impl.GenericObjectPool; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LookObjectPool extends BasePooledObjectFactory { + + private static final ObjectPool instance = new GenericObjectPool<>(new LookObjectPool()); + + @Override + public Look create() { + return new Look(); + } + + @Override + public PooledObject wrap(Look look) { + return new DefaultPooledObject<>(look); + } + + @SneakyThrows + public static Look borrowObject() { + return instance.borrowObject(); + } + + @SneakyThrows + public static void returnObject(Look look) { + instance.returnObject(look); + } +}