Archived
0

refactoring: Pooled objects

This commit is contained in:
2021-05-10 03:58:31 +03:00
parent 38918f5eaf
commit a5f68e76e5
7 changed files with 101 additions and 20 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<Location> {
private static final ObjectPool<Location> instance = new GenericObjectPool<>(new LocationObjectPool());
@Override
public Location create() {
return new Location();
}
@Override
public PooledObject<Location> 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);
}
}

View File

@@ -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<Look> {
private static final ObjectPool<Look> instance = new GenericObjectPool<>(new LookObjectPool());
@Override
public Look create() {
return new Look();
}
@Override
public PooledObject<Look> 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);
}
}