реорганизация pool objects
This commit is contained in:
@@ -1,8 +1,7 @@
|
|||||||
apply from: rootDir.toPath().resolve('logic.gradle').toFile()
|
apply from: rootDir.toPath().resolve('logic.gradle').toFile()
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api project(':utils')
|
implementation libs.objpool
|
||||||
|
|
||||||
implementation libs.netty.transport
|
implementation libs.netty.transport
|
||||||
implementation libs.netty.codec
|
implementation libs.netty.codec
|
||||||
implementation libs.json
|
implementation libs.json
|
||||||
|
|||||||
@@ -3,11 +3,13 @@ package mc.protocol.buffer;
|
|||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
import lombok.experimental.Delegate;
|
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.protocol.pool.Passivable;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@@ -48,10 +50,15 @@ import java.util.UUID;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@EqualsAndHashCode(callSuper = false)
|
@EqualsAndHashCode(callSuper = false)
|
||||||
@ToString
|
@ToString
|
||||||
public class NetByteBuf extends ByteBuf {
|
public class NetByteBuf extends ByteBuf implements Passivable {
|
||||||
|
|
||||||
@Delegate
|
@Delegate
|
||||||
private final ByteBuf byteBuf;
|
private 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));
|
||||||
@@ -120,22 +127,7 @@ public class NetByteBuf extends ByteBuf {
|
|||||||
|
|
||||||
//region VarInt
|
//region VarInt
|
||||||
public int readVarInt() {
|
public int readVarInt() {
|
||||||
int numRead = 0;
|
return readVarInt(this.byteBuf);
|
||||||
int result = 0;
|
|
||||||
byte read;
|
|
||||||
do {
|
|
||||||
if ((numRead + 1) > 5) {
|
|
||||||
log.warn("VarInt is too big");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
read = readByte();
|
|
||||||
int value = (read & 0b01111111);
|
|
||||||
result |= (value << (7 * numRead));
|
|
||||||
|
|
||||||
numRead++;
|
|
||||||
} while ((read & 0b10000000) != 0);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void writeVarInt(int value) {
|
public void writeVarInt(int value) {
|
||||||
@@ -189,4 +181,28 @@ public class NetByteBuf extends ByteBuf {
|
|||||||
writeLong(uuid.getLeastSignificantBits());
|
writeLong(uuid.getLeastSignificantBits());
|
||||||
}
|
}
|
||||||
//endregion
|
//endregion
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void passivate() {
|
||||||
|
this.byteBuf = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int readVarInt(ByteBuf byteBuf) {
|
||||||
|
int numRead = 0;
|
||||||
|
int result = 0;
|
||||||
|
byte read;
|
||||||
|
do {
|
||||||
|
if ((numRead + 1) > 5) {
|
||||||
|
log.warn("VarInt is too big");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
read = byteBuf.readByte();
|
||||||
|
int value = (read & 0b01111111);
|
||||||
|
result |= (value << (7 * numRead));
|
||||||
|
|
||||||
|
numRead++;
|
||||||
|
} while ((read & 0b10000000) != 0);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ import mc.protocol.State;
|
|||||||
import mc.protocol.packets.ClientSidePacket;
|
import mc.protocol.packets.ClientSidePacket;
|
||||||
import mc.protocol.utils.Table;
|
import mc.protocol.utils.Table;
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
|
||||||
public class ProtocolHandlersBus {
|
public class ProtocolHandlersBus {
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
private final Table<State, Class<? extends ClientSidePacket>, Handler> table = new Table<>();
|
private final Table<State, Class<? extends ClientSidePacket>, Handler> table = new Table<>();
|
||||||
|
|
||||||
public <P extends ClientSidePacket> ProtocolHandlersBus addHandler(State state, Class<P> packetClass, Handler<P> handler) {
|
public <P extends ClientSidePacket> ProtocolHandlersBus addHandler(State state, Class<P> packetClass, Handler<P> handler) {
|
||||||
@@ -15,6 +15,7 @@ public class ProtocolHandlersBus {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
public <P extends ClientSidePacket> void process(State state, ChannelHandlerContext ctx, P packet) {
|
public <P extends ClientSidePacket> void process(State state, ChannelHandlerContext ctx, P packet) {
|
||||||
Handler handler = table.getColumnAndRow(state, packet.getClass());
|
Handler handler = table.getColumnAndRow(state, packet.getClass());
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import mc.protocol.ProtocolAttributes;
|
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 org.apache.commons.pool2.ObjectPool;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -20,9 +22,11 @@ public class ProtocolInboundHandler extends SimpleChannelInboundHandler<ClientSi
|
|||||||
private final ProtocolHandlersBus protocolHandlersBus;
|
private final ProtocolHandlersBus protocolHandlersBus;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) {
|
protected void channelRead0(ChannelHandlerContext ctx, ClientSidePacket packet) throws Exception {
|
||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import mc.protocol.State;
|
|||||||
import mc.protocol.buffer.NetByteBuf;
|
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.PacketObjectPool;
|
import mc.protocol.pool.ProtocolObjectPool;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
@@ -29,7 +29,7 @@ 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) throws Exception {
|
||||||
State state = Objects.requireNonNull(ctx.channel().attr(ProtocolAttributes.STATE).get());
|
State state = Objects.requireNonNull(ctx.channel().attr(ProtocolAttributes.STATE).get());
|
||||||
NetByteBuf netByteBuf = new NetByteBuf(in);
|
NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(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 +37,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 = new UnknownPacket();
|
UnknownPacket unknownPacket = ProtocolObjectPool.getPacketPool().borrowObject(UnknownPacket.class);
|
||||||
unknownPacket.setState(state);
|
unknownPacket.setState(state);
|
||||||
unknownPacket.setId(packetId);
|
unknownPacket.setId(packetId);
|
||||||
unknownPacket.setDataSize(netByteBuf.readableBytes());
|
unknownPacket.setDataSize(netByteBuf.readableBytes());
|
||||||
@@ -47,13 +47,15 @@ public class ProtocolDecoder extends ByteToMessageDecoder {
|
|||||||
netByteBuf.skipBytes(netByteBuf.readableBytes());
|
netByteBuf.skipBytes(netByteBuf.readableBytes());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ClientSidePacket packet = PacketObjectPool.getInstance().getPool(packetClass).borrowObject();
|
ClientSidePacket packet = ProtocolObjectPool.getPacketPool().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) {
|
||||||
|
|||||||
@@ -9,6 +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 java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
@@ -28,12 +29,15 @@ public class ProtocolEncoder extends MessageToByteEncoder<ServerSidePacket> {
|
|||||||
log.debug("OUT: {}:{}", state, packet);
|
log.debug("OUT: {}:{}", state, packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
NetByteBuf buffer = new NetByteBuf(Unpooled.buffer());
|
NetByteBuf buffer = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(Unpooled.buffer());
|
||||||
buffer.writeVarInt(packetId);
|
buffer.writeVarInt(packetId);
|
||||||
packet.writeSelf(buffer);
|
packet.writeSelf(buffer);
|
||||||
|
|
||||||
NetByteBuf netByteBuf = new NetByteBuf(out);
|
NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(out);
|
||||||
netByteBuf.writeVarInt(buffer.readableBytes());
|
netByteBuf.writeVarInt(buffer.readableBytes());
|
||||||
netByteBuf.writeBytes(buffer);
|
netByteBuf.writeBytes(buffer);
|
||||||
|
|
||||||
|
ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf);
|
||||||
|
ProtocolObjectPool.getNetByteBufPool().returnObject(buffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +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 java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -12,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 = new NetByteBuf(in);
|
NetByteBuf netByteBuf = ProtocolObjectPool.getNetByteBufPool().borrowObject().setByteBuf(in);
|
||||||
netByteBuf.markReaderIndex();
|
netByteBuf.markReaderIndex();
|
||||||
|
|
||||||
do {
|
do {
|
||||||
@@ -25,7 +26,7 @@ public class ProtocolSplitter extends ByteToMessageDecoder {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int sizePacket = new NetByteBuf(Unpooled.wrappedBuffer(sizePacketRaw)).readVarInt();
|
int sizePacket = NetByteBuf.readVarInt(Unpooled.wrappedBuffer(sizePacketRaw));
|
||||||
|
|
||||||
if (netByteBuf.readableBytes() >= sizePacket) {
|
if (netByteBuf.readableBytes() >= sizePacket) {
|
||||||
byte[] bytes = new byte[sizePacket];
|
byte[] bytes = new byte[sizePacket];
|
||||||
@@ -36,5 +37,7 @@ public class ProtocolSplitter extends ByteToMessageDecoder {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (netByteBuf.readableBytes() > 0);
|
} while (netByteBuf.readableBytes() > 0);
|
||||||
|
|
||||||
|
ProtocolObjectPool.getNetByteBufPool().returnObject(netByteBuf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package mc.protocol.packets;
|
package mc.protocol.packets;
|
||||||
|
|
||||||
import mc.protocol.buffer.NetByteBuf;
|
import mc.protocol.buffer.NetByteBuf;
|
||||||
import mc.utils.pool.Passivable;
|
import mc.protocol.pool.Passivable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Пакеты отправляемые клиентом.
|
* Пакеты отправляемые клиентом.
|
||||||
|
|||||||
@@ -8,8 +8,7 @@ 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.protocol.pool.LocationObjectPool;
|
import mc.protocol.pool.ProtocolObjectPool;
|
||||||
import mc.protocol.pool.LookObjectPool;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Клиент сообщает о движении и повороте головы Игрока.
|
* Клиент сообщает о движении и повороте головы Игрока.
|
||||||
@@ -44,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 = LocationObjectPool.borrowObject().set(x, y, z);
|
this.position = ProtocolObjectPool.getLocationPool().borrowObject().set(x, y, z);
|
||||||
|
|
||||||
float yaw = netByteBuf.readFloat();
|
float yaw = netByteBuf.readFloat();
|
||||||
float pitch = netByteBuf.readFloat();
|
float pitch = netByteBuf.readFloat();
|
||||||
this.look = LookObjectPool.borrowObject().set(yaw, pitch);
|
this.look = ProtocolObjectPool.getLookPool().borrowObject().set(yaw, pitch);
|
||||||
|
|
||||||
this.onGround = netByteBuf.readBoolean();
|
this.onGround = netByteBuf.readBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void passivate() {
|
public void passivate() {
|
||||||
LocationObjectPool.returnObject(this.position);
|
ProtocolObjectPool.getLocationPool().returnObject(this.position);
|
||||||
this.position = null;
|
this.position = null;
|
||||||
LookObjectPool.returnObject(this.look);
|
ProtocolObjectPool.getLookPool().returnObject(this.look);
|
||||||
this.look = null;
|
this.look = null;
|
||||||
this.onGround = false;
|
this.onGround = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import lombok.ToString;
|
|||||||
import mc.protocol.buffer.NetByteBuf;
|
import mc.protocol.buffer.NetByteBuf;
|
||||||
import mc.protocol.model.Look;
|
import mc.protocol.model.Look;
|
||||||
import mc.protocol.packets.ClientSidePacket;
|
import mc.protocol.packets.ClientSidePacket;
|
||||||
import mc.protocol.pool.LookObjectPool;
|
import mc.protocol.pool.ProtocolObjectPool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Клиент сообщает о повороте головы Игрока.
|
* Клиент сообщает о повороте головы Игрока.
|
||||||
@@ -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 = LookObjectPool.borrowObject().set(yaw, pitch);
|
this.look = ProtocolObjectPool.getLookPool().borrowObject().set(yaw, pitch);
|
||||||
|
|
||||||
this.onGround = netByteBuf.readBoolean();
|
this.onGround = netByteBuf.readBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void passivate() {
|
public void passivate() {
|
||||||
LookObjectPool.returnObject(this.look);
|
ProtocolObjectPool.getLookPool().returnObject(this.look);
|
||||||
this.look = null;
|
this.look = null;
|
||||||
this.onGround = false;
|
this.onGround = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import lombok.ToString;
|
|||||||
import mc.protocol.buffer.NetByteBuf;
|
import mc.protocol.buffer.NetByteBuf;
|
||||||
import mc.protocol.model.Location;
|
import mc.protocol.model.Location;
|
||||||
import mc.protocol.packets.ClientSidePacket;
|
import mc.protocol.packets.ClientSidePacket;
|
||||||
import mc.protocol.pool.LocationObjectPool;
|
import mc.protocol.pool.ProtocolObjectPool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Клиент сообщает о движении Игрока.
|
* Клиент сообщает о движении Игрока.
|
||||||
@@ -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 = LocationObjectPool.borrowObject().set(x, y, z);
|
this.position = ProtocolObjectPool.getLocationPool().borrowObject().set(x, y, z);
|
||||||
|
|
||||||
this.onGround = netByteBuf.readBoolean();
|
this.onGround = netByteBuf.readBoolean();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void passivate() {
|
public void passivate() {
|
||||||
LocationObjectPool.returnObject(this.position);
|
ProtocolObjectPool.getLocationPool().returnObject(this.position);
|
||||||
this.position = null;
|
this.position = null;
|
||||||
this.onGround = false;
|
this.onGround = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ 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.protocol.pool.ProtocolObjectPool;
|
||||||
|
import mc.protocol.pool.SneakyObjectPool;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Данные чанка.
|
* Данные чанка.
|
||||||
@@ -78,16 +80,18 @@ public class ChunkDataPacket implements ServerSidePacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static {
|
static {
|
||||||
voidData = new NetByteBuf(Unpooled.buffer());
|
SneakyObjectPool<NetByteBuf> pool = ProtocolObjectPool.getNetByteBufPool();
|
||||||
|
|
||||||
|
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 = new NetByteBuf(Unpooled.buffer());
|
NetByteBuf data = pool.borrowObject().setByteBuf(Unpooled.buffer());
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
NetByteBuf dataBuff = new NetByteBuf(Unpooled.wrappedBuffer(new byte[4096]));
|
NetByteBuf dataBuff = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[4096]));
|
||||||
NetByteBuf blockLight = new NetByteBuf(Unpooled.wrappedBuffer(new byte[2048]));
|
NetByteBuf blockLight = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[2048]));
|
||||||
NetByteBuf skyLight = new NetByteBuf(Unpooled.wrappedBuffer(new byte[2048]));
|
NetByteBuf skyLight = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[2048]));
|
||||||
NetByteBuf biomes = new NetByteBuf(Unpooled.wrappedBuffer(new byte[256]));
|
NetByteBuf biomes = pool.borrowObject().setByteBuf(Unpooled.wrappedBuffer(new byte[256]));
|
||||||
|
|
||||||
data.writeUnsignedByte(13);
|
data.writeUnsignedByte(13);
|
||||||
data.writeUnsignedByte(0);
|
data.writeUnsignedByte(0);
|
||||||
@@ -96,6 +100,11 @@ 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());
|
||||||
@@ -104,5 +113,7 @@ public class ChunkDataPacket implements ServerSidePacket {
|
|||||||
|
|
||||||
voidData.markReaderIndex();
|
voidData.markReaderIndex();
|
||||||
voidData.markWriterIndex();
|
voidData.markWriterIndex();
|
||||||
|
|
||||||
|
pool.returnObject(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package mc.protocol.pool;
|
||||||
|
|
||||||
|
import org.apache.commons.pool2.ObjectPool;
|
||||||
|
import org.apache.commons.pool2.impl.GenericObjectPool;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class MultiPassivateObjectPool<T extends Passivable> {
|
||||||
|
|
||||||
|
@SuppressWarnings("rawtypes")
|
||||||
|
private final Map<Class, ObjectPool> mapPool = new HashMap<>();
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <P extends T> P borrowObject(Class<P> clazz) throws Exception {
|
||||||
|
return (P) pool(clazz).borrowObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public <P extends T> void returnObject(P obj) throws Exception {
|
||||||
|
pool(obj.getClass()).returnObject(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||||
|
private ObjectPool pool(Class clazz) {
|
||||||
|
return mapPool.computeIfAbsent(clazz, tClass -> new GenericObjectPool(new PassivatePooledObjectFactory(clazz)));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
package mc.protocol.pool;
|
|
||||||
|
|
||||||
import lombok.AccessLevel;
|
|
||||||
import lombok.Getter;
|
|
||||||
import lombok.NoArgsConstructor;
|
|
||||||
import mc.protocol.packets.ClientSidePacket;
|
|
||||||
import mc.utils.pool.WideClassObjectPool;
|
|
||||||
|
|
||||||
@NoArgsConstructor(access = AccessLevel.PRIVATE)
|
|
||||||
public class PacketObjectPool extends WideClassObjectPool<ClientSidePacket> {
|
|
||||||
|
|
||||||
@Getter
|
|
||||||
private static final PacketObjectPool instance = new PacketObjectPool();
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package mc.utils.pool;
|
package mc.protocol.pool;
|
||||||
|
|
||||||
public interface Passivable {
|
public interface Passivable {
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package mc.protocol.pool;
|
||||||
|
|
||||||
|
import org.apache.commons.pool2.PooledObject;
|
||||||
|
|
||||||
|
public class PassivatePooledObjectFactory<T extends Passivable> extends SimplePooledObjectFactory<T> {
|
||||||
|
|
||||||
|
public PassivatePooledObjectFactory(Class<T> clazz) {
|
||||||
|
super(clazz);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void passivateObject(PooledObject<T> pooledObject) {
|
||||||
|
pooledObject.getObject().passivate();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package mc.protocol.pool;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import mc.protocol.buffer.NetByteBuf;
|
||||||
|
import mc.protocol.model.Location;
|
||||||
|
import mc.protocol.model.Look;
|
||||||
|
import mc.protocol.packets.ClientSidePacket;
|
||||||
|
|
||||||
|
public final class ProtocolObjectPool {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static final SneakyObjectPool<Location> locationPool = new SneakyObjectPool<>(new SimplePooledObjectFactory<>(Location.class));
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static final SneakyObjectPool<Look> lookPool = new SneakyObjectPool<>(new SimplePooledObjectFactory<>(Look.class));
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static final SneakyObjectPool<NetByteBuf> netByteBufPool = new SneakyObjectPool<>(new PassivatePooledObjectFactory<>(NetByteBuf.class));
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static final MultiPassivateObjectPool<ClientSidePacket> packetPool = new MultiPassivateObjectPool<>();
|
||||||
|
|
||||||
|
private ProtocolObjectPool() {
|
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package mc.protocol.pool;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.apache.commons.pool2.BasePooledObjectFactory;
|
||||||
|
import org.apache.commons.pool2.PooledObject;
|
||||||
|
import org.apache.commons.pool2.impl.DefaultPooledObject;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class SimplePooledObjectFactory<T> extends BasePooledObjectFactory<T> {
|
||||||
|
|
||||||
|
private final Class<T> clazz;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T create() throws Exception {
|
||||||
|
return clazz.getDeclaredConstructor().newInstance();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PooledObject<T> wrap(T obj) {
|
||||||
|
return new DefaultPooledObject<>(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package mc.protocol.pool;
|
||||||
|
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.apache.commons.pool2.PooledObjectFactory;
|
||||||
|
import org.apache.commons.pool2.impl.GenericObjectPool;
|
||||||
|
|
||||||
|
public class SneakyObjectPool<T> extends GenericObjectPool<T> {
|
||||||
|
|
||||||
|
public SneakyObjectPool(PooledObjectFactory<T> factory) {
|
||||||
|
super(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SneakyThrows
|
||||||
|
public T borrowObject() {
|
||||||
|
return super.borrowObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,6 @@ rootProject.projectDir.toPath().resolve('gradle.properties').readLines().forEach
|
|||||||
|
|
||||||
rootProject.name = map.get('prj.name')
|
rootProject.name = map.get('prj.name')
|
||||||
|
|
||||||
include('utils')
|
|
||||||
include('cli-parser')
|
include('cli-parser')
|
||||||
include('protocol')
|
include('protocol')
|
||||||
include('server')
|
include('server')
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
apply from: rootDir.toPath().resolve('logic.gradle').toFile()
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
api libs.objpool
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# suppress inspection "UnusedProperty" for whole file
|
|
||||||
module.name=utils
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package mc.utils.pool;
|
|
||||||
|
|
||||||
import org.apache.commons.pool2.BasePooledObjectFactory;
|
|
||||||
import org.apache.commons.pool2.PooledObject;
|
|
||||||
import org.apache.commons.pool2.impl.DefaultPooledObject;
|
|
||||||
|
|
||||||
public abstract class PassivablePooledObjectFactory<T extends Passivable> extends BasePooledObjectFactory<T> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PooledObject<T> wrap(T obj) {
|
|
||||||
return new DefaultPooledObject<>(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void passivateObject(PooledObject<T> pooledObject) {
|
|
||||||
pooledObject.getObject().passivate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
package mc.utils.pool;
|
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
|
||||||
import org.apache.commons.pool2.ObjectPool;
|
|
||||||
import org.apache.commons.pool2.impl.GenericObjectPool;
|
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
|
||||||
public abstract class WideClassObjectPool<T extends Passivable> {
|
|
||||||
|
|
||||||
private final Map<Class, ObjectPool> mapPool = new HashMap<>();
|
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public <R extends T> ObjectPool<R> getPool(Class<R> clazz) {
|
|
||||||
return mapPool.computeIfAbsent(clazz, tClass -> new GenericObjectPool<R>(new WideClassFactory(clazz)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
|
||||||
private class WideClassFactory<R extends T> extends PassivablePooledObjectFactory<R> {
|
|
||||||
|
|
||||||
private final Class<R> clazz;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public R create() throws Exception {
|
|
||||||
return clazz.getDeclaredConstructor().newInstance();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user