Reduce allocation count

This commit is contained in:
TheMode 2021-08-04 04:00:42 +02:00
parent 9bb50430d4
commit 557d34c378
5 changed files with 39 additions and 59 deletions

View File

@ -2,7 +2,6 @@ package net.minestom.server.network;
import net.minestom.server.MinecraftServer;
import net.minestom.server.entity.Player;
import net.minestom.server.network.netty.packet.InboundPacket;
import net.minestom.server.network.packet.client.ClientPlayPacket;
import net.minestom.server.network.packet.client.ClientPreplayPacket;
import net.minestom.server.network.packet.client.handler.ClientLoginPacketsHandler;
@ -17,6 +16,8 @@ import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
/**
* Responsible for processing client packets.
* <p>
@ -41,14 +42,12 @@ public final class PacketProcessor {
this.playPacketsHandler = new ClientPlayPacketsHandler();
}
public void process(@NotNull NettyPlayerConnection playerConnection, @NotNull InboundPacket packet) {
// Increment packet count (checked in PlayerConnection#update)
public void process(@NotNull NettyPlayerConnection playerConnection, int packetId, ByteBuffer body) {
if (MinecraftServer.getRateLimit() > 0) {
// Increment packet count (checked in PlayerConnection#update)
playerConnection.getPacketCounter().incrementAndGet();
}
final int packetId = packet.getPacketId();
BinaryReader binaryReader = new BinaryReader(packet.getBody());
BinaryReader binaryReader = new BinaryReader(body);
final ConnectionState connectionState = playerConnection.getConnectionState();
if (connectionState == ConnectionState.UNKNOWN) {
// Should be handshake packet

View File

@ -1,23 +0,0 @@
package net.minestom.server.network.netty.packet;
import org.jetbrains.annotations.NotNull;
import java.nio.ByteBuffer;
public class InboundPacket {
private final int packetId;
private final ByteBuffer body;
public InboundPacket(int id, @NotNull ByteBuffer body) {
this.packetId = id;
this.body = body;
}
public int getPacketId() {
return packetId;
}
public @NotNull ByteBuffer getBody() {
return body;
}
}

View File

@ -1,4 +1,4 @@
package net.minestom.server.network.netty.packet;
package net.minestom.server.network.packet;
import org.jetbrains.annotations.NotNull;
@ -9,13 +9,19 @@ import java.nio.ByteBuffer;
* Can be used if you want to send the exact same buffer to multiple clients without processing it more than once.
*/
public final class FramedPacket {
private final int packetId;
private final ByteBuffer body;
public FramedPacket(@NotNull ByteBuffer body) {
public FramedPacket(int packetId, @NotNull ByteBuffer body) {
this.packetId = packetId;
this.body = body;
}
public @NotNull ByteBuffer getBody() {
public int packetId() {
return packetId;
}
public @NotNull ByteBuffer body() {
return body;
}
}

View File

@ -6,8 +6,7 @@ import net.minestom.server.adventure.MinestomAdventure;
import net.minestom.server.entity.PlayerSkin;
import net.minestom.server.network.ConnectionState;
import net.minestom.server.network.PacketProcessor;
import net.minestom.server.network.netty.packet.FramedPacket;
import net.minestom.server.network.netty.packet.InboundPacket;
import net.minestom.server.network.packet.FramedPacket;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.packet.server.login.SetCompressionPacket;
@ -90,38 +89,37 @@ public class NettyPlayerConnection extends PlayerConnection {
readBuffer.limit(packetEnd); // Ensure that the reader doesn't exceed packet bound
// Read protocol
var content = workerContext.contentBuffer.clear();
{
if (!compressed) {
// Compression disabled, payload is following
ByteBuffer content;
if (!compressed) {
// Compression disabled, payload is following
content = readBuffer;
} else {
final int dataLength = Utils.readVarInt(readBuffer);
if (dataLength == 0) {
// Data is too small to be compressed, payload is following
content = readBuffer;
} else {
final int dataLength = Utils.readVarInt(readBuffer);
if (dataLength == 0) {
// Data is too small to be compressed, payload is following
content = readBuffer;
} else {
// Decompress to content buffer
try {
final var inflater = workerContext.inflater;
inflater.setInput(readBuffer);
inflater.inflate(content);
inflater.reset();
} catch (DataFormatException e) {
e.printStackTrace();
}
content.flip();
// Decompress to content buffer
content = workerContext.contentBuffer.clear();
try {
final var inflater = workerContext.inflater;
inflater.setInput(readBuffer);
inflater.inflate(content);
inflater.reset();
} catch (DataFormatException e) {
e.printStackTrace();
}
content.flip();
}
}
// Process packet
final int packetId = Utils.readVarInt(content);
try {
packetProcessor.process(this, new InboundPacket(packetId, content));
packetProcessor.process(this, packetId, content);
} catch (Exception e) {
// Error while reading the packet
e.printStackTrace();
MinecraftServer.getExceptionManager().handleException(e);
break;
}
@ -196,7 +194,7 @@ public class NettyPlayerConnection extends PlayerConnection {
}
public void write(@NotNull FramedPacket framedPacket) {
attemptWrite(framedPacket.getBody());
attemptWrite(framedPacket.body());
}
public void write(@NotNull ByteBuffer buffer) {

View File

@ -7,7 +7,7 @@ import net.minestom.server.adventure.MinestomAdventure;
import net.minestom.server.adventure.audience.PacketGroupingAudience;
import net.minestom.server.entity.Player;
import net.minestom.server.listener.manager.PacketListenerManager;
import net.minestom.server.network.netty.packet.FramedPacket;
import net.minestom.server.network.packet.FramedPacket;
import net.minestom.server.network.packet.server.ComponentHoldingServerPacket;
import net.minestom.server.network.packet.server.ServerPacket;
import net.minestom.server.network.player.NettyPlayerConnection;
@ -89,9 +89,9 @@ public final class PacketUtils {
// Send grouped packet...
final boolean success = PACKET_LISTENER_MANAGER.processServerPacket(packet, players);
if (success) {
ByteBuffer finalBuffer = ByteBuffer.allocate(200_000);
ByteBuffer finalBuffer = ByteBuffer.allocate(200_000); // TODO don't allocate
writeFramedPacket(finalBuffer, packet, MinecraftServer.getCompressionThreshold() > 0);
final FramedPacket framedPacket = new FramedPacket(finalBuffer);
final FramedPacket framedPacket = new FramedPacket(packet.getId(), finalBuffer);
// Send packet to all players
for (Player player : players) {
if (!player.isOnline())