From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: jellysquid3 Date: Sat, 8 Jul 2023 21:38:05 +0200 Subject: [PATCH] Array backed synched entity data Original code by jellysquid3 in Lithium, licensed under the GNU Lesser General Public License v3.0 (https://www.gnu.org/licenses/lgpl-3.0.html) diff --git a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java index d088479d160dbd2fc90b48a30553be141db8eef2..07a362f9e485d0d507f16f1dda1ac84ade07ab27 100644 --- a/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java +++ b/src/main/java/net/minecraft/network/syncher/SynchedEntityData.java @@ -34,6 +34,11 @@ public class SynchedEntityData { private final Int2ObjectMap> itemsById = new Int2ObjectOpenHashMap(); // private final ReadWriteLock lock = new ReentrantReadWriteLock(); // Spigot - not required private boolean isDirty; + // Paper start - Perf: array backed synched entity data + private static final int DEFAULT_ENTRY_COUNT = 10; + private static final int GROW_FACTOR = 8; + private SynchedEntityData.DataItem[] itemsArray = new SynchedEntityData.DataItem[DEFAULT_ENTRY_COUNT]; + // Paper end - Perf: array backed synched entity data public SynchedEntityData(Entity trackedEntity) { this.entity = trackedEntity; @@ -103,6 +108,15 @@ public class SynchedEntityData { // this.lock.writeLock().lock(); // Spigot - not required this.itemsById.put(key.getId(), datawatcher_item); // this.lock.writeLock().unlock(); // Spigot - not required + // Paper start - Perf: array backed synched entity data + if (this.itemsArray.length <= key.getId()) { + final int newSize = Math.min(key.getId() + GROW_FACTOR, MAX_ID_VALUE); + + this.itemsArray = java.util.Arrays.copyOf(this.itemsArray, newSize); + } + + this.itemsArray[key.getId()] = datawatcher_item; + // Paper end - Perf: array backed synched entity data } public boolean hasItem(EntityDataAccessor key) { @@ -130,7 +144,15 @@ public class SynchedEntityData { return datawatcher_item; */ - return (SynchedEntityData.DataItem) this.itemsById.get(key.getId()); + // Paper start - Perf: array backed synched entity data + final int id = key.getId(); + + if (id < 0 || id >= this.itemsArray.length) { + return null; + } + + return (DataItem) this.itemsArray[id]; + // Paper end - Perf: array backed synched entity data // Spigot end }