aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0885-Array-backed-synched-entity-data.patch
blob: 2345458940b397ce0aa04512e0467e1f129b7fb1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: jellysquid3 <jellysquid3@users.noreply.github.com>
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<SynchedEntityData.DataItem<?>> 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 <T> boolean hasItem(EntityDataAccessor<T> 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<T>) this.itemsArray[id];
+        // Paper end - Perf: array backed synched entity data
         // Spigot end
     }