mirror of https://github.com/Minestom/Minestom.git
Move local buffers
Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
parent
32d692a56a
commit
d0b874ed7c
|
@ -14,9 +14,9 @@ import net.minestom.server.network.packet.server.play.UpdateLightPacket;
|
|||
import net.minestom.server.network.packet.server.play.data.ChunkData;
|
||||
import net.minestom.server.network.packet.server.play.data.LightData;
|
||||
import net.minestom.server.utils.MathUtils;
|
||||
import net.minestom.server.utils.PacketUtils;
|
||||
import net.minestom.server.utils.Utils;
|
||||
import net.minestom.server.utils.binary.BinaryWriter;
|
||||
import net.minestom.server.utils.binary.PooledBuffers;
|
||||
import net.minestom.server.utils.chunk.ChunkUtils;
|
||||
import net.minestom.server.world.biomes.Biome;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
@ -196,7 +196,7 @@ public class DynamicChunk extends Chunk {
|
|||
"WORLD_SURFACE", NBT.LongArray(Utils.encodeBlocks(worldSurface, bitsForHeight))));
|
||||
}
|
||||
// Data
|
||||
final BinaryWriter writer = new BinaryWriter(PacketUtils.localBuffer());
|
||||
final BinaryWriter writer = new BinaryWriter(PooledBuffers.tempBuffer());
|
||||
for (Section section : sections) writer.write(section);
|
||||
return new ChunkDataPacket(chunkX, chunkZ,
|
||||
new ChunkData(heightmapsNBT, writer.toByteArray(), entries),
|
||||
|
|
|
@ -383,7 +383,7 @@ public class PlayerSocketConnection extends PlayerConnection {
|
|||
|
||||
private void writeBufferSync(@NotNull ByteBuffer buffer, int index, int length) {
|
||||
if (encrypted) { // Encryption support
|
||||
ByteBuffer output = PacketUtils.localBuffer();
|
||||
ByteBuffer output = PooledBuffers.tempBuffer();
|
||||
try {
|
||||
this.encryptCipher.update(buffer.slice(index, length), output);
|
||||
buffer = output.flip();
|
||||
|
|
|
@ -18,7 +18,6 @@ import net.minestom.server.network.packet.server.SendablePacket;
|
|||
import net.minestom.server.network.packet.server.ServerPacket;
|
||||
import net.minestom.server.network.player.PlayerConnection;
|
||||
import net.minestom.server.network.player.PlayerSocketConnection;
|
||||
import net.minestom.server.network.socket.Server;
|
||||
import net.minestom.server.network.socket.Worker;
|
||||
import net.minestom.server.utils.binary.BinaryBuffer;
|
||||
import net.minestom.server.utils.binary.BinaryWriter;
|
||||
|
@ -55,22 +54,12 @@ public final class PacketUtils {
|
|||
public static final boolean CACHED_PACKET = getBoolean("minestom.cached-packet", true);
|
||||
public static final boolean VIEWABLE_PACKET = getBoolean("minestom.viewable-packet", true);
|
||||
|
||||
/// Local buffers
|
||||
private static final LocalCache<ByteBuffer> PACKET_BUFFER = LocalCache.ofBuffer(Server.MAX_PACKET_SIZE);
|
||||
private static final LocalCache<ByteBuffer> LOCAL_BUFFER = LocalCache.ofBuffer(Server.MAX_PACKET_SIZE);
|
||||
|
||||
// Viewable packets
|
||||
private static final ConcurrentMap<Viewable, ViewableStorage> VIEWABLE_STORAGE_MAP = ConcurrentMap.class.cast(Caffeine.newBuilder().weakKeys().build().asMap());
|
||||
|
||||
private PacketUtils() {
|
||||
}
|
||||
|
||||
@ApiStatus.Internal
|
||||
@ApiStatus.Experimental
|
||||
public static ByteBuffer localBuffer() {
|
||||
return LOCAL_BUFFER.get().clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a packet to an audience. This method performs the following steps in the
|
||||
* following order:
|
||||
|
@ -250,7 +239,7 @@ public final class PacketUtils {
|
|||
final boolean compressed = packetSize >= MinecraftServer.getCompressionThreshold();
|
||||
if (compressed) {
|
||||
// Packet large enough, compress it
|
||||
final ByteBuffer input = localBuffer().put(0, buffer, contentStart, packetSize);
|
||||
final ByteBuffer input = PooledBuffers.tempBuffer().put(0, buffer, contentStart, packetSize);
|
||||
Deflater deflater = LOCAL_DEFLATER.get();
|
||||
deflater.setInput(input.limit(packetSize));
|
||||
deflater.finish();
|
||||
|
@ -264,7 +253,7 @@ public final class PacketUtils {
|
|||
|
||||
@ApiStatus.Internal
|
||||
public static ByteBuffer createFramedPacket(@NotNull ServerPacket packet, boolean compression) {
|
||||
ByteBuffer buffer = PACKET_BUFFER.get().clear();
|
||||
ByteBuffer buffer = PooledBuffers.packetBuffer();
|
||||
writeFramedPacket(buffer, packet, compression);
|
||||
return buffer.flip();
|
||||
}
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
package net.minestom.server.utils.binary;
|
||||
|
||||
import net.minestom.server.network.socket.Server;
|
||||
import net.minestom.server.utils.cache.LocalCache;
|
||||
import org.jctools.queues.MessagePassingQueue;
|
||||
import org.jctools.queues.MpmcUnboundedXaddArrayQueue;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
|
||||
import java.lang.ref.Cleaner;
|
||||
import java.lang.ref.SoftReference;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Collection;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
|
@ -16,6 +19,23 @@ public final class PooledBuffers {
|
|||
private final static int BUFFER_SIZE = Integer.getInteger("minestom.pooled-buffer-size", 262_143);
|
||||
private final static Cleaner CLEANER = Cleaner.create();
|
||||
|
||||
private static final LocalCache<ByteBuffer> PACKET_BUFFER = LocalCache.ofBuffer(Server.MAX_PACKET_SIZE);
|
||||
private static final LocalCache<ByteBuffer> LOCAL_BUFFER = LocalCache.ofBuffer(Server.MAX_PACKET_SIZE);
|
||||
|
||||
/**
|
||||
* Thread local buffer containing raw packet stream.
|
||||
*/
|
||||
public static ByteBuffer packetBuffer() {
|
||||
return PACKET_BUFFER.get().clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Thread local buffer targeted at very small scope operations (encryption, compression, ...).
|
||||
*/
|
||||
public static ByteBuffer tempBuffer() {
|
||||
return LOCAL_BUFFER.get().clear();
|
||||
}
|
||||
|
||||
public static BinaryBuffer get() {
|
||||
BinaryBuffer buffer;
|
||||
SoftReference<BinaryBuffer> ref;
|
||||
|
|
Loading…
Reference in New Issue