mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
152 lines
7.0 KiB
Diff
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
|
|
}
|
|
}
|
|
}
|