mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-27 22:17:45 +02:00
Reduce allocation count
This commit is contained in:
parent
9bb50430d4
commit
557d34c378
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -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())
|
||||
|
Loading…
Reference in New Issue
Block a user