geforkt von Mirrors/Velocity
[Experimental] Remove PacketWrapper objects
In both Velocity and BungeeCord, the most commonly created object is an object that encapsulates a Minecraft packet and a its associated byte data. At first, I considered trying to recycle these objects, but then I discovered that this object has no reason to exist, and actually somewhat complicates the implementation. Thus, this commit removes these objects, making Velocity more more GC-friendly by not allocating frequently-created objects. This is still an experimental change, but it's a fairly safe one to make.
Dieser Commit ist enthalten in:
Ursprung
fdf5f27da6
Commit
abbdf70d5e
@ -5,12 +5,12 @@ import com.velocitypowered.natives.compression.VelocityCompressor;
|
|||||||
import com.velocitypowered.natives.encryption.VelocityCipherFactory;
|
import com.velocitypowered.natives.encryption.VelocityCipherFactory;
|
||||||
import com.velocitypowered.natives.util.Natives;
|
import com.velocitypowered.natives.util.Natives;
|
||||||
import com.velocitypowered.proxy.VelocityServer;
|
import com.velocitypowered.proxy.VelocityServer;
|
||||||
import com.velocitypowered.proxy.protocol.PacketWrapper;
|
import com.velocitypowered.proxy.protocol.MinecraftPacket;
|
||||||
import com.velocitypowered.proxy.protocol.ProtocolConstants;
|
import com.velocitypowered.proxy.protocol.ProtocolConstants;
|
||||||
import com.velocitypowered.proxy.protocol.StateRegistry;
|
import com.velocitypowered.proxy.protocol.StateRegistry;
|
||||||
import com.velocitypowered.natives.encryption.JavaVelocityCipher;
|
|
||||||
import com.velocitypowered.natives.encryption.VelocityCipher;
|
import com.velocitypowered.natives.encryption.VelocityCipher;
|
||||||
import com.velocitypowered.proxy.protocol.netty.*;
|
import com.velocitypowered.proxy.protocol.netty.*;
|
||||||
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.channel.Channel;
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelFutureListener;
|
import io.netty.channel.ChannelFutureListener;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
@ -79,18 +79,13 @@ public class MinecraftConnection extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
if (msg instanceof PacketWrapper) {
|
if (msg instanceof MinecraftPacket) {
|
||||||
PacketWrapper pw = (PacketWrapper) msg;
|
sessionHandler.handle((MinecraftPacket) msg);
|
||||||
|
} else if (msg instanceof ByteBuf) {
|
||||||
try {
|
try {
|
||||||
if (sessionHandler != null) {
|
sessionHandler.handleUnknown((ByteBuf) msg);
|
||||||
if (pw.getPacket() == null) {
|
|
||||||
sessionHandler.handleUnknown(pw.getBuffer());
|
|
||||||
} else {
|
|
||||||
sessionHandler.handle(pw.getPacket());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} finally {
|
} finally {
|
||||||
ReferenceCountUtil.release(pw.getBuffer());
|
ReferenceCountUtil.release(msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,30 +0,0 @@
|
|||||||
package com.velocitypowered.proxy.protocol;
|
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
|
||||||
import io.netty.buffer.ByteBufUtil;
|
|
||||||
|
|
||||||
public class PacketWrapper {
|
|
||||||
private final MinecraftPacket packet;
|
|
||||||
private final ByteBuf buffer;
|
|
||||||
|
|
||||||
public PacketWrapper(MinecraftPacket packet, ByteBuf buffer) {
|
|
||||||
this.packet = packet;
|
|
||||||
this.buffer = buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MinecraftPacket getPacket() {
|
|
||||||
return packet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ByteBuf getBuffer() {
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
return "PacketWrapper{" +
|
|
||||||
"packet=" + packet +
|
|
||||||
", buffer=" + ByteBufUtil.hexDump(buffer) +
|
|
||||||
'}';
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,10 +1,8 @@
|
|||||||
package com.velocitypowered.proxy.protocol.netty;
|
package com.velocitypowered.proxy.protocol.netty;
|
||||||
|
|
||||||
import com.velocitypowered.proxy.protocol.PacketWrapper;
|
|
||||||
import com.velocitypowered.proxy.protocol.packet.LegacyHandshake;
|
import com.velocitypowered.proxy.protocol.packet.LegacyHandshake;
|
||||||
import com.velocitypowered.proxy.protocol.packet.LegacyPing;
|
import com.velocitypowered.proxy.protocol.packet.LegacyPing;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
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;
|
||||||
|
|
||||||
@ -21,10 +19,10 @@ public class LegacyPingDecoder extends ByteToMessageDecoder {
|
|||||||
short second = in.getUnsignedByte(in.readerIndex() + 1);
|
short second = in.getUnsignedByte(in.readerIndex() + 1);
|
||||||
if (first == 0xfe && second == 0x01) {
|
if (first == 0xfe && second == 0x01) {
|
||||||
in.skipBytes(in.readableBytes());
|
in.skipBytes(in.readableBytes());
|
||||||
out.add(new PacketWrapper(new LegacyPing(), Unpooled.EMPTY_BUFFER));
|
out.add(new LegacyPing());
|
||||||
} else if (first == 0x02) {
|
} else if (first == 0x02) {
|
||||||
in.skipBytes(in.readableBytes());
|
in.skipBytes(in.readableBytes());
|
||||||
out.add(new PacketWrapper(new LegacyHandshake(), Unpooled.EMPTY_BUFFER));
|
out.add(new LegacyHandshake());
|
||||||
} else {
|
} else {
|
||||||
ctx.pipeline().remove(this);
|
ctx.pipeline().remove(this);
|
||||||
}
|
}
|
||||||
|
@ -26,13 +26,13 @@ public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteBuf slice = msg.retainedSlice();
|
ByteBuf slice = msg.slice();
|
||||||
|
|
||||||
int packetId = ProtocolUtils.readVarInt(msg);
|
int packetId = ProtocolUtils.readVarInt(msg);
|
||||||
MinecraftPacket packet = this.protocolVersion.createPacket(packetId);
|
MinecraftPacket packet = this.protocolVersion.createPacket(packetId);
|
||||||
if (packet == null) {
|
if (packet == null) {
|
||||||
msg.skipBytes(msg.readableBytes());
|
msg.skipBytes(msg.readableBytes());
|
||||||
out.add(new PacketWrapper(null, slice));
|
out.add(slice.retain());
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
packet.decode(msg, direction, protocolVersion.id);
|
packet.decode(msg, direction, protocolVersion.id);
|
||||||
@ -40,7 +40,7 @@ public class MinecraftDecoder extends MessageToMessageDecoder<ByteBuf> {
|
|||||||
throw new CorruptedFrameException("Error decoding " + packet.getClass() + " Direction " + direction
|
throw new CorruptedFrameException("Error decoding " + packet.getClass() + " Direction " + direction
|
||||||
+ " Protocol " + protocolVersion + " State " + state + " ID " + Integer.toHexString(packetId), e);
|
+ " Protocol " + protocolVersion + " State " + state + " ID " + Integer.toHexString(packetId), e);
|
||||||
}
|
}
|
||||||
out.add(new PacketWrapper(packet, slice));
|
out.add(packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren