рефакторинг object pool
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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<ClientSi
|
||||
private final ProtocolHandlersBus protocolHandlersBus;
|
||||
|
||||
@Override
|
||||
protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) throws Exception {
|
||||
protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) {
|
||||
State state = Objects.requireNonNull(ctx.channel().attr(ProtocolAttributes.STATE).get());
|
||||
protocolHandlersBus.process(state, ctx, packet);
|
||||
|
||||
ProtocolObjectPool.getPacketPool().returnObject(packet);
|
||||
ProtocolObjectPool.packet().returnObject(packet);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -11,6 +11,7 @@ import mc.protocol.buffer.NetByteBuf;
|
||||
import mc.protocol.packets.ClientSidePacket;
|
||||
import mc.protocol.packets.UnknownPacket;
|
||||
import mc.protocol.pool.ProtocolObjectPool;
|
||||
import mc.protocol.pool.UnpooledNetByteBuf;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
@@ -27,9 +28,9 @@ public class ProtocolDecoder extends ByteToMessageDecoder {
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
|
||||
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> 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<? extends ClientSidePacket> 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) {
|
||||
|
||||
@@ -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<ServerSidePacket> {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Object> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<NetByteBuf> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<NetByteBuf> {
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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<Location> locationPool = new SimpleObjectPool<>(Location.class);
|
||||
|
||||
@Getter
|
||||
private static final ObjectPool<Look> lookPool = new SimpleObjectPool<>(Look.class);
|
||||
|
||||
@Getter
|
||||
private static final ObjectPool<NetByteBuf> netByteBufPool = new PassivableObjectPool<>(NetByteBuf.class);
|
||||
|
||||
@Getter
|
||||
private static final NetByteBufObjectPool netByteBufPool = new NetByteBufObjectPool();
|
||||
private static final MultiObjectPool<ClientSidePacket> packetPool = new PassivableMultiObjectPool<>();
|
||||
|
||||
public static ObjectPool<Location> location() {
|
||||
return locationPool;
|
||||
}
|
||||
|
||||
public static ObjectPool<Look> look() {
|
||||
return lookPool;
|
||||
}
|
||||
|
||||
public static NetByteBufObjectPool netByteBuf() {
|
||||
return netByteBufPool;
|
||||
}
|
||||
|
||||
public static MultiObjectPool<ClientSidePacket> packet() {
|
||||
return packetPool;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
apply from: rootDir.toPath().resolve('logic.gradle').toFile()
|
||||
|
||||
dependencies {
|
||||
implementation libs.objpool
|
||||
api libs.objpool
|
||||
}
|
||||
@@ -2,9 +2,9 @@ package mc.utils.pool;
|
||||
|
||||
import org.apache.commons.pool2.PooledObject;
|
||||
|
||||
class PassivablePooledObjectFactory<T extends Passivable> extends SimplePooledObjectFactory<T> {
|
||||
public class PassivablePooledObjectFactory<T extends Passivable> extends SimplePooledObjectFactory<T> {
|
||||
|
||||
PassivablePooledObjectFactory(Class<T> clazz) {
|
||||
public PassivablePooledObjectFactory(Class<T> clazz) {
|
||||
super(clazz);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user