Move local buffers

Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
TheMode 2022-01-26 05:01:43 +01:00
parent 32d692a56a
commit d0b874ed7c
4 changed files with 25 additions and 16 deletions

View File

@ -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),

View File

@ -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();

View File

@ -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();
}

View File

@ -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;