From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Tue, 9 Nov 2077 00:00:00 +0800 Subject: [PATCH] Remove stream in PlayerSensor Stream operations in PlayerSensor take too much time while ticking Villager farms, so just replace it with for loop =-= Before: 164ms After: 18ms diff --git a/net/minecraft/world/entity/ai/sensing/PlayerSensor.java b/net/minecraft/world/entity/ai/sensing/PlayerSensor.java index eb3ec4be63e1710d0ed9021eb8158d56eae89f8d..fa438315b4ed8e9394383b82b89ecb04bac3399f 100644 --- a/net/minecraft/world/entity/ai/sensing/PlayerSensor.java +++ b/net/minecraft/world/entity/ai/sensing/PlayerSensor.java @@ -26,17 +26,39 @@ public class PlayerSensor extends Sensor { @Override protected void doTick(ServerLevel level, LivingEntity entity) { - List list = level.players() - .stream() - .filter(EntitySelector.NO_SPECTATORS) - .filter(serverPlayer -> entity.closerThan(serverPlayer, this.getFollowDistance(entity))) - .sorted(Comparator.comparingDouble(entity::distanceToSqr)) - .collect(Collectors.toList()); + // Leaf start - Remove stream in PlayerSensor + List list = new java.util.ArrayList<>(); + for (Player serverPlayer : level.players()) { + if (!EntitySelector.NO_SPECTATORS.test(serverPlayer)) { + continue; + } + if (!entity.closerThan(serverPlayer, this.getFollowDistance(entity))) { + continue; + } + + list.add(serverPlayer); + } + list.sort(Comparator.comparingDouble(entity::distanceToSqr)); + // Leaf end - Remove stream in PlayerSensor Brain brain = entity.getBrain(); brain.setMemory(MemoryModuleType.NEAREST_PLAYERS, list); - List list1 = list.stream().filter(player -> isEntityTargetable(level, entity, player)).collect(Collectors.toList()); + // Leaf start - Remove stream in PlayerSensor + List list1 = new java.util.ArrayList<>(list.size()); + for (Player player : list) { + if (isEntityTargetable(level, entity, player)) { + list1.add(player); + } + } + // Leaf end - Remove stream in PlayerSensor brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_PLAYER, list1.isEmpty() ? null : list1.get(0)); - List list2 = list1.stream().filter(player -> isEntityAttackable(level, entity, player)).toList(); + // Leaf start - Remove stream in PlayerSensor + List list2 = new java.util.ArrayList<>(list1.size()); + for (Player player : list1) { + if (isEntityAttackable(level, entity, player)) { + list2.add(player); + } + } + // Leaf end - Remove stream in PlayerSensor brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_ATTACKABLE_PLAYERS, list2); brain.setMemory(MemoryModuleType.NEAREST_VISIBLE_ATTACKABLE_PLAYER, list2.isEmpty() ? null : list2.get(0)); }