send individual section updates when less than half of the sections are updated.

This commit is contained in:
Matt Worzala 2021-01-26 08:46:14 -05:00
parent d0163ae749
commit 7166525b8c
2 changed files with 10 additions and 29 deletions

View File

@ -8,7 +8,6 @@ import net.minestom.server.entity.Player;
import net.minestom.server.entity.pathfinding.PFColumnarSpace; import net.minestom.server.entity.pathfinding.PFColumnarSpace;
import net.minestom.server.event.player.PlayerChunkLoadEvent; import net.minestom.server.event.player.PlayerChunkLoadEvent;
import net.minestom.server.event.player.PlayerChunkUnloadEvent; import net.minestom.server.event.player.PlayerChunkUnloadEvent;
import net.minestom.server.instance.batch.BatchOption;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.instance.block.BlockManager; import net.minestom.server.instance.block.BlockManager;
import net.minestom.server.instance.block.CustomBlock; import net.minestom.server.instance.block.CustomBlock;
@ -31,7 +30,6 @@ import org.jetbrains.annotations.Nullable;
import java.util.*; import java.util.*;
import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;
// TODO light data & API // TODO light data & API
@ -547,23 +545,6 @@ public abstract class Chunk implements Viewable, DataContainer {
PacketUtils.sendGroupedPacket(getViewers(), getFreshFullDataPacket()); PacketUtils.sendGroupedPacket(getViewers(), getFreshFullDataPacket());
} }
/**
* Sends a single section {@link ChunkDataPacket} to all chunk viewers.
*
* @param section The section to send.
*/
public synchronized void sendChunkSectionUpdate(int section) {
Check.argCondition(!MathUtils.isBetween(section, 0, CHUNK_SECTION_COUNT),
"The chunk section " + section + " does not exist");
PacketUtils.sendGroupedPacket(
//todo An option to filter out non-netty clients in sendGroupedPacket would be nice.
getViewers()
.stream()
.filter(PlayerUtils::isNettyClient)
.collect(Collectors.toUnmodifiableList()),
createChunkSectionUpdatePacket(section));
}
/** /**
* Sends a chunk section update packet to {@code player}. * Sends a chunk section update packet to {@code player}.
* *
@ -589,7 +570,6 @@ public abstract class Chunk implements Viewable, DataContainer {
@NotNull @NotNull
protected ChunkDataPacket createChunkSectionUpdatePacket(int section) { protected ChunkDataPacket createChunkSectionUpdatePacket(int section) {
ChunkDataPacket chunkDataPacket = getFreshPartialDataPacket(); ChunkDataPacket chunkDataPacket = getFreshPartialDataPacket();
chunkDataPacket.fullChunk = false;
int[] sections = new int[CHUNK_SECTION_COUNT]; int[] sections = new int[CHUNK_SECTION_COUNT];
sections[section] = 1; sections[section] = 1;
chunkDataPacket.sections = sections; chunkDataPacket.sections = sections;

View File

@ -10,10 +10,13 @@ import net.minestom.server.data.Data;
import net.minestom.server.instance.Chunk; import net.minestom.server.instance.Chunk;
import net.minestom.server.instance.Instance; import net.minestom.server.instance.Instance;
import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.network.packet.server.play.ChunkDataPacket;
import net.minestom.server.utils.PacketUtils;
import net.minestom.server.utils.block.CustomBlockUtils; import net.minestom.server.utils.block.CustomBlockUtils;
import net.minestom.server.utils.callback.OptionalCallback; import net.minestom.server.utils.callback.OptionalCallback;
import net.minestom.server.utils.chunk.ChunkCallback; import net.minestom.server.utils.chunk.ChunkCallback;
import net.minestom.server.utils.chunk.ChunkUtils; import net.minestom.server.utils.chunk.ChunkUtils;
import net.minestom.server.utils.player.PlayerUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -35,7 +38,6 @@ import java.util.function.IntConsumer;
* @see Batch * @see Batch
*/ */
public class ChunkBatch implements Batch<ChunkCallback> { public class ChunkBatch implements Batch<ChunkCallback> {
private static final int CHUNK_SECTION_THRESHOLD = Chunk.CHUNK_SECTION_COUNT / 2;
private static final Logger LOGGER = LoggerFactory.getLogger(ChunkBatch.class); private static final Logger LOGGER = LoggerFactory.getLogger(ChunkBatch.class);
@ -252,15 +254,14 @@ public class ChunkBatch implements Batch<ChunkCallback> {
/** /**
* Updates the given chunk for all of its viewers, and executes the callback. * Updates the given chunk for all of its viewers, and executes the callback.
*/ */
private void updateChunk(@NotNull Instance instance, Chunk chunk, IntSet sections, @Nullable ChunkCallback callback, boolean safeCallback) { private void updateChunk(@NotNull Instance instance, Chunk chunk, IntSet updatedSections, @Nullable ChunkCallback callback, boolean safeCallback) {
// Refresh chunk for viewers // Refresh chunk for viewers
if (sections.size() <= CHUNK_SECTION_THRESHOLD) { ChunkDataPacket chunkDataPacket = chunk.getFreshPartialDataPacket();
// Update only a few sections of the chunk int[] sections = new int[Chunk.CHUNK_SECTION_COUNT];
sections.forEach((IntConsumer) chunk::sendChunkSectionUpdate); for (int section : updatedSections)
} else { sections[section] = 1;
// Update the entire chunk chunkDataPacket.sections = sections;
chunk.sendChunk(); PacketUtils.sendGroupedPacket(chunk.getViewers(), chunkDataPacket, PlayerUtils::isNettyClient);
}
if (instance instanceof InstanceContainer) { if (instance instanceof InstanceContainer) {
// FIXME: put method in Instance instead // FIXME: put method in Instance instead