9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00
Files
Leaf/leaf-server/paper-patches/features/0008-Pufferfish-Optimize-mob-spawning.patch

152 lines
7.0 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Kevin Raneri <kevin.raneri@gmail.com>
Date: Wed, 10 Nov 2021 00:37:03 -0500
Subject: [PATCH] Pufferfish: Optimize mob spawning
Original license: GPL v3
Original project: https://github.com/pufferfish-gg/Pufferfish
Co-authored-by: booky10 <boooky10@gmail.com>
Co-authored-by: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com>
This patch aims to reduce the main-thread impact of mob spawning by
offloading as much work as possible to other threads. It is possible for
inconsistencies to come up, but when they happen they never interfere
with the server's operation (they don't produce errors), and side
effects are limited to more or less mobs being spawned in any particular
tick.
It is possible to disable this optimization if it is not required or if
it interferes with any plugins. On servers with thousands of entities,
this can result in performance gains of up to 15%, which is significant
and, in my opinion, worth the low risk of minor mob-spawning-related
inconsistencies.
diff --git a/src/main/java/ca/spottedleaf/moonrise/common/list/IteratorSafeOrderedReferenceSet.java b/src/main/java/ca/spottedleaf/moonrise/common/list/IteratorSafeOrderedReferenceSet.java
index ece6db7b9a0dfd535141c0c756947c4898140503..82b84d72bf1b3c43d734fe381b67377de5f30187 100644
--- a/src/main/java/ca/spottedleaf/moonrise/common/list/IteratorSafeOrderedReferenceSet.java
+++ b/src/main/java/ca/spottedleaf/moonrise/common/list/IteratorSafeOrderedReferenceSet.java
@@ -11,7 +11,7 @@ public final class IteratorSafeOrderedReferenceSet<E> {
public static final int ITERATOR_FLAG_SEE_ADDITIONS = 1 << 0;
private final Reference2IntLinkedOpenHashMap<E> indexMap;
- private int firstInvalidIndex = -1;
+ private final java.util.concurrent.atomic.AtomicInteger firstInvalidIndex = new java.util.concurrent.atomic.AtomicInteger(-1); // Leaf - Pufferfish - Async mob spawning - atomic
/* list impl */
private E[] listElements;
@@ -19,7 +19,7 @@ public final class IteratorSafeOrderedReferenceSet<E> {
private final double maxFragFactor;
- private int iteratorCount;
+ private final java.util.concurrent.atomic.AtomicInteger iteratorCount = new java.util.concurrent.atomic.AtomicInteger(); // Pufferfish - async mob spawning
public IteratorSafeOrderedReferenceSet() {
this(Object.class);
@@ -99,11 +99,11 @@ public final class IteratorSafeOrderedReferenceSet<E> {
}
public int createRawIterator() {
- ++this.iteratorCount;
+ this.iteratorCount.incrementAndGet(); // Pufferfish - async mob spawning
if (this.indexMap.isEmpty()) {
return Integer.MAX_VALUE;
} else {
- return this.firstInvalidIndex == 0 ? this.indexMap.getInt(this.indexMap.firstKey()) : 0;
+ return this.firstInvalidIndex.get() == 0 ? this.indexMap.getInt(this.indexMap.firstKey()) : 0; // Leaf - Pufferfish - Async mob spawning
}
}
@@ -120,7 +120,7 @@ public final class IteratorSafeOrderedReferenceSet<E> {
}
public void finishRawIterator() {
- if (--this.iteratorCount == 0) {
+ if (this.iteratorCount.decrementAndGet() == 0) { // Pufferfish - async mob spawning
if (this.getFragFactor() >= this.maxFragFactor) {
this.defrag();
}
@@ -130,14 +130,17 @@ public final class IteratorSafeOrderedReferenceSet<E> {
public boolean remove(final E element) {
final int index = this.indexMap.removeInt(element);
if (index >= 0) {
- if (this.firstInvalidIndex < 0 || index < this.firstInvalidIndex) {
- this.firstInvalidIndex = index;
+ // Leaf start - Pufferfish - Async mob spawning
+ int firstInvalidIndex = this.firstInvalidIndex.get();
+ if (firstInvalidIndex < 0 || index < firstInvalidIndex) {
+ this.firstInvalidIndex.set(index);
}
+ // Leaf end - Pufferfish - Async mob spawning
if (this.listElements[index] != element) {
throw new IllegalStateException();
}
this.listElements[index] = null;
- if (this.iteratorCount == 0 && this.getFragFactor() >= this.maxFragFactor) {
+ if (this.iteratorCount.get() == 0 && this.getFragFactor() >= this.maxFragFactor) { // Pufferfish - async mob spawning
this.defrag();
}
//this.check();
@@ -169,14 +172,17 @@ public final class IteratorSafeOrderedReferenceSet<E> {
}
private void defrag() {
- if (this.firstInvalidIndex < 0) {
+ // Leaf start - Pufferfish - Async mob spawning
+ int firstInvalidIndex = this.firstInvalidIndex.get();
+ if (firstInvalidIndex < 0) {
return; // nothing to do
}
+ // Leaf end - Pufferfish - Async mob spawning
if (this.indexMap.isEmpty()) {
Arrays.fill(this.listElements, 0, this.listSize, null);
this.listSize = 0;
- this.firstInvalidIndex = -1;
+ this.firstInvalidIndex.set(-1); // Leaf - Pufferfish - Async mob spawning
//this.check();
return;
}
@@ -186,11 +192,11 @@ public final class IteratorSafeOrderedReferenceSet<E> {
int lastValidIndex;
java.util.Iterator<Reference2IntMap.Entry<E>> iterator;
- if (this.firstInvalidIndex == 0) {
+ if (firstInvalidIndex == 0) { // Leaf - Pufferfish - Async mob spawning
iterator = this.indexMap.reference2IntEntrySet().fastIterator();
lastValidIndex = 0;
} else {
- lastValidIndex = this.firstInvalidIndex;
+ lastValidIndex = firstInvalidIndex; // Leaf - Pufferfish - Async mob spawning
final E key = backingArray[lastValidIndex - 1];
iterator = this.indexMap.reference2IntEntrySet().fastIterator(new Reference2IntMap.Entry<E>() {
@Override
@@ -221,7 +227,7 @@ public final class IteratorSafeOrderedReferenceSet<E> {
// cleanup end
Arrays.fill(backingArray, lastValidIndex, this.listSize, null);
this.listSize = lastValidIndex;
- this.firstInvalidIndex = -1;
+ this.firstInvalidIndex.set(-1); // Leaf - Pufferfish - Async mob spawning
//this.check();
}
@@ -235,7 +241,7 @@ public final class IteratorSafeOrderedReferenceSet<E> {
}
public IteratorSafeOrderedReferenceSet.Iterator<E> iterator(final int flags) {
- ++this.iteratorCount;
+ this.iteratorCount.incrementAndGet(); // Pufferfish - async mob spawning
return new BaseIterator<>(this, true, (flags & ITERATOR_FLAG_SEE_ADDITIONS) != 0 ? Integer.MAX_VALUE : this.listSize);
}
@@ -322,7 +328,7 @@ public final class IteratorSafeOrderedReferenceSet<E> {
}
this.lastReturned = null;
this.finished = true;
- this.set.finishRawIterator();
+ this.set.finishRawIterator(); // Pufferfish - async mob spawning - diff on change
}
}
}