Archived
0

рефакторинг object pool

This commit is contained in:
2021-07-09 13:40:31 +03:00
parent 41acf32cb8
commit 84b4069f7b
15 changed files with 121 additions and 71 deletions

View File

@@ -8,7 +8,6 @@ import lombok.experimental.Delegate;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.protocol.model.text.Text; import mc.protocol.model.text.Text;
import mc.protocol.model.text.TextSerializer; import mc.protocol.model.text.TextSerializer;
import mc.utils.pool.Passivable;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.UUID; import java.util.UUID;
@@ -49,15 +48,10 @@ import java.util.UUID;
@RequiredArgsConstructor @RequiredArgsConstructor
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@ToString @ToString
public class NetByteBuf extends ByteBuf implements Passivable { public abstract class NetByteBuf extends ByteBuf {
@Delegate @Delegate
private ByteBuf byteBuf; protected ByteBuf byteBuf;
public NetByteBuf setByteBuf(ByteBuf byteBuf) {
this.byteBuf = byteBuf;
return this;
}
public void writeUnsignedByte(int value) { public void writeUnsignedByte(int value) {
byteBuf.writeByte((byte)(value & 0xFF)); byteBuf.writeByte((byte)(value & 0xFF));
@@ -181,11 +175,6 @@ public class NetByteBuf extends ByteBuf implements Passivable {
} }
//endregion //endregion
@Override
public void passivate() {
this.byteBuf = null;
}
public static int readVarInt(ByteBuf byteBuf) { public static int readVarInt(ByteBuf byteBuf) {
int numRead = 0; int numRead = 0;
int result = 0; int result = 0;

View File

@@ -8,7 +8,6 @@ import mc.protocol.ProtocolAttributes;
import mc.protocol.State; import mc.protocol.State;
import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ClientSidePacket;
import mc.protocol.pool.ProtocolObjectPool; import mc.protocol.pool.ProtocolObjectPool;
import org.apache.commons.pool2.ObjectPool;
import java.io.IOException; import java.io.IOException;
import java.util.Objects; import java.util.Objects;
@@ -22,11 +21,11 @@ public class ProtocolInboundHandler extends SimpleChannelInboundHandler<ClientSi
private final ProtocolHandlersBus protocolHandlersBus; private final ProtocolHandlersBus protocolHandlersBus;
@Override @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()); State state = Objects.requireNonNull(ctx.channel().attr(ProtocolAttributes.STATE).get());
protocolHandlersBus.process(state, ctx, packet); protocolHandlersBus.process(state, ctx, packet);
ProtocolObjectPool.getPacketPool().returnObject(packet); ProtocolObjectPool.packet().returnObject(packet);
} }
@Override @Override

View File

@@ -11,6 +11,7 @@ import mc.protocol.buffer.NetByteBuf;
import mc.protocol.packets.ClientSidePacket; import mc.protocol.packets.ClientSidePacket;
import mc.protocol.packets.UnknownPacket; import mc.protocol.packets.UnknownPacket;
import mc.protocol.pool.ProtocolObjectPool; import mc.protocol.pool.ProtocolObjectPool;
import mc.protocol.pool.UnpooledNetByteBuf;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
@@ -27,9 +28,9 @@ public class ProtocolDecoder extends ByteToMessageDecoder {
} }
@Override @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()); 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(); int packetId = netByteBuf.readVarInt();
Class<? extends ClientSidePacket> packetClass = state.getClientSidePacketById(packetId); 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)); log.warn("Unknown packet: State {} ; Id 0x{}", state, packetIdAsHexcode(packetId));
if (readUnknownPackets) { if (readUnknownPackets) {
UnknownPacket unknownPacket = ProtocolObjectPool.getPacketPool().borrowObject(UnknownPacket.class); UnknownPacket unknownPacket = ProtocolObjectPool.packet().borrowObject(UnknownPacket.class);
unknownPacket.setState(state); unknownPacket.setState(state);
unknownPacket.setId(packetId); unknownPacket.setId(packetId);
unknownPacket.setDataSize(netByteBuf.readableBytes()); unknownPacket.setDataSize(netByteBuf.readableBytes());
@@ -47,15 +48,13 @@ public class ProtocolDecoder extends ByteToMessageDecoder {
netByteBuf.skipBytes(netByteBuf.readableBytes()); netByteBuf.skipBytes(netByteBuf.readableBytes());
} }
} else { } else {
ClientSidePacket packet = ProtocolObjectPool.getPacketPool().borrowObject(packetClass); ClientSidePacket packet = ProtocolObjectPool.packet().borrowObject(packetClass);
packet.readSelf(netByteBuf); packet.readSelf(netByteBuf);
if (log.isDebugEnabled()) { if (log.isDebugEnabled()) {
log.debug("IN: {}:{}", state, packet); log.debug("IN: {}:{}", state, packet);
} }
out.add(packet); out.add(packet);
} }
ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf);
} }
private static String packetIdAsHexcode(int packetId) { private static String packetIdAsHexcode(int packetId) {

View File

@@ -9,7 +9,7 @@ import mc.protocol.ProtocolAttributes;
import mc.protocol.State; import mc.protocol.State;
import mc.protocol.buffer.NetByteBuf; import mc.protocol.buffer.NetByteBuf;
import mc.protocol.packets.ServerSidePacket; import mc.protocol.packets.ServerSidePacket;
import mc.protocol.pool.ProtocolObjectPool; import mc.protocol.pool.UnpooledNetByteBuf;
import java.util.Objects; import java.util.Objects;
@@ -29,15 +29,12 @@ public class ProtocolEncoder extends MessageToByteEncoder<ServerSidePacket> {
log.debug("OUT: {}:{}", state, packet); log.debug("OUT: {}:{}", state, packet);
} }
NetByteBuf buffer = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(Unpooled.buffer()); NetByteBuf buffer = new UnpooledNetByteBuf(Unpooled.buffer());
buffer.writeVarInt(packetId); buffer.writeVarInt(packetId);
packet.writeSelf(buffer); packet.writeSelf(buffer);
NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(out); NetByteBuf netByteBuf = new UnpooledNetByteBuf(out);
netByteBuf.writeVarInt(buffer.readableBytes()); netByteBuf.writeVarInt(buffer.readableBytes());
netByteBuf.writeBytes(buffer); netByteBuf.writeBytes(buffer);
ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf);
ProtocolObjectPool.getNetByteBufPool().returnObject(buffer);
} }
} }

View File

@@ -5,7 +5,7 @@ import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.ByteToMessageDecoder;
import mc.protocol.buffer.NetByteBuf; import mc.protocol.buffer.NetByteBuf;
import mc.protocol.pool.ProtocolObjectPool; import mc.protocol.pool.UnpooledNetByteBuf;
import java.util.List; import java.util.List;
@@ -13,7 +13,7 @@ public class ProtocolSplitter extends ByteToMessageDecoder {
@Override @Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) { protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(in); NetByteBuf netByteBuf = new UnpooledNetByteBuf(in);
netByteBuf.markReaderIndex(); netByteBuf.markReaderIndex();
do { do {
@@ -37,7 +37,5 @@ public class ProtocolSplitter extends ByteToMessageDecoder {
break; break;
} }
} while (netByteBuf.readableBytes() > 0); } while (netByteBuf.readableBytes() > 0);
ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf);
} }
} }

View File

@@ -43,20 +43,20 @@ public class CPlayerPositionAndLookPacket implements ClientSidePacket {
double x = netByteBuf.readDouble(); double x = netByteBuf.readDouble();
double y = netByteBuf.readDouble(); double y = netByteBuf.readDouble();
double z = 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 yaw = netByteBuf.readFloat();
float pitch = 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(); this.onGround = netByteBuf.readBoolean();
} }
@Override @Override
public void passivate() { public void passivate() {
ProtocolObjectPool.getLocationPool().returnObject(this.position); ProtocolObjectPool.location().returnObject(this.position);
this.position = null; this.position = null;
ProtocolObjectPool.getLookPool().returnObject(this.look); ProtocolObjectPool.look().returnObject(this.look);
this.look = null; this.look = null;
this.onGround = false; this.onGround = false;
} }

View File

@@ -36,14 +36,14 @@ public class PlayerLookPacket implements ClientSidePacket {
public void readSelf(NetByteBuf netByteBuf) { public void readSelf(NetByteBuf netByteBuf) {
float yaw = netByteBuf.readFloat(); float yaw = netByteBuf.readFloat();
float pitch = 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(); this.onGround = netByteBuf.readBoolean();
} }
@Override @Override
public void passivate() { public void passivate() {
ProtocolObjectPool.getLookPool().returnObject(this.look); ProtocolObjectPool.look().returnObject(this.look);
this.look = null; this.look = null;
this.onGround = false; this.onGround = false;
} }

View File

@@ -39,14 +39,14 @@ public class PlayerPositionPacket implements ClientSidePacket {
double x = netByteBuf.readDouble(); double x = netByteBuf.readDouble();
double y = netByteBuf.readDouble(); double y = netByteBuf.readDouble();
double z = 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(); this.onGround = netByteBuf.readBoolean();
} }
@Override @Override
public void passivate() { public void passivate() {
ProtocolObjectPool.getLocationPool().returnObject(this.position); ProtocolObjectPool.location().returnObject(this.position);
this.position = null; this.position = null;
this.onGround = false; this.onGround = false;
} }

View File

@@ -4,8 +4,7 @@ import io.netty.buffer.Unpooled;
import lombok.Data; import lombok.Data;
import mc.protocol.buffer.NetByteBuf; import mc.protocol.buffer.NetByteBuf;
import mc.protocol.packets.ServerSidePacket; import mc.protocol.packets.ServerSidePacket;
import mc.utils.pool.ObjectPool; import mc.protocol.pool.UnpooledNetByteBuf;
import mc.protocol.pool.ProtocolObjectPool;
/** /**
* Данные чанка. * Данные чанка.
@@ -80,18 +79,16 @@ public class ChunkDataPacket implements ServerSidePacket {
} }
static { static {
ObjectPool<NetByteBuf> pool = ProtocolObjectPool.getNetByteBufPool(); voidData = new UnpooledNetByteBuf(Unpooled.buffer());
voidData = pool.borrowObject().setByteBuf(Unpooled.buffer());
voidData.writeBoolean(true); // Is Full chunk voidData.writeBoolean(true); // Is Full chunk
voidData.writeVarInt(0b11111111); // Available Sections 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++) { for (int i = 0; i < 16; i++) {
NetByteBuf dataBuff = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[4096])); NetByteBuf dataBuff = new UnpooledNetByteBuf(Unpooled.wrappedBuffer(new byte[4096]));
NetByteBuf blockLight = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[2048])); NetByteBuf blockLight = new UnpooledNetByteBuf(Unpooled.wrappedBuffer(new byte[2048]));
NetByteBuf skyLight = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[2048])); NetByteBuf skyLight = new UnpooledNetByteBuf(Unpooled.wrappedBuffer(new byte[2048]));
NetByteBuf biomes = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[256])); NetByteBuf biomes = new UnpooledNetByteBuf(Unpooled.wrappedBuffer(new byte[256]));
data.writeUnsignedByte(13); data.writeUnsignedByte(13);
data.writeUnsignedByte(0); data.writeUnsignedByte(0);
@@ -100,11 +97,6 @@ public class ChunkDataPacket implements ServerSidePacket {
data.writeBytes(blockLight); data.writeBytes(blockLight);
data.writeBytes(skyLight); data.writeBytes(skyLight);
data.writeBytes(biomes); data.writeBytes(biomes);
pool.returnObject(biomes);
pool.returnObject(skyLight);
pool.returnObject(blockLight);
pool.returnObject(dataBuff);
} }
voidData.writeVarInt(data.readableBytes()); voidData.writeVarInt(data.readableBytes());
@@ -113,7 +105,5 @@ public class ChunkDataPacket implements ServerSidePacket {
voidData.markReaderIndex(); voidData.markReaderIndex();
voidData.markWriterIndex(); voidData.markWriterIndex();
pool.returnObject(data);
} }
} }

View File

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

View File

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

View File

@@ -1,26 +1,36 @@
package mc.protocol.pool; package mc.protocol.pool;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import mc.protocol.buffer.NetByteBuf;
import mc.protocol.model.Location; import mc.protocol.model.Location;
import mc.protocol.model.Look; import mc.protocol.model.Look;
import mc.protocol.packets.ClientSidePacket; 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) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class ProtocolObjectPool { public final class ProtocolObjectPool {
@Getter
private static final ObjectPool<Location> locationPool = new SimpleObjectPool<>(Location.class); private static final ObjectPool<Location> locationPool = new SimpleObjectPool<>(Location.class);
@Getter
private static final ObjectPool<Look> lookPool = new SimpleObjectPool<>(Look.class); private static final ObjectPool<Look> lookPool = new SimpleObjectPool<>(Look.class);
private static final NetByteBufObjectPool netByteBufPool = new NetByteBufObjectPool();
@Getter
private static final ObjectPool<NetByteBuf> netByteBufPool = new PassivableObjectPool<>(NetByteBuf.class);
@Getter
private static final MultiObjectPool<ClientSidePacket> packetPool = new PassivableMultiObjectPool<>(); 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;
}
} }

View File

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

View File

@@ -1,5 +1,5 @@
apply from: rootDir.toPath().resolve('logic.gradle').toFile() apply from: rootDir.toPath().resolve('logic.gradle').toFile()
dependencies { dependencies {
implementation libs.objpool api libs.objpool
} }

View File

@@ -2,9 +2,9 @@ package mc.utils.pool;
import org.apache.commons.pool2.PooledObject; 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); super(clazz);
} }