mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
1. Wet the drys 2. Dry the wets 3. Wet the drys 4. Dry the wets 5. Wet the drys 6. Now dust the wets
83 lines
3.8 KiB
Diff
83 lines
3.8 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 c21e00812f1aaa1279834a0562d360d6b89e146c..4ae478c04ef44c91408a7f3f0405291f91794873 100644
|
|
--- a/src/main/java/ca/spottedleaf/moonrise/common/list/IteratorSafeOrderedReferenceSet.java
|
|
+++ b/src/main/java/ca/spottedleaf/moonrise/common/list/IteratorSafeOrderedReferenceSet.java
|
|
@@ -10,7 +10,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 volatile int firstInvalidIndex = -1; // Leaf - Async mob spawning - volatile
|
|
|
|
/* list impl */
|
|
private E[] listElements;
|
|
@@ -18,7 +18,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(16, 0.75f, 16, 0.2);
|
|
@@ -79,7 +79,7 @@ public final class IteratorSafeOrderedReferenceSet<E> {
|
|
}
|
|
|
|
public int createRawIterator() {
|
|
- ++this.iteratorCount;
|
|
+ this.iteratorCount.incrementAndGet(); // Pufferfish - async mob spawning
|
|
if (this.indexMap.isEmpty()) {
|
|
return -1;
|
|
} else {
|
|
@@ -100,7 +100,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();
|
|
}
|
|
@@ -117,7 +117,7 @@ public final class IteratorSafeOrderedReferenceSet<E> {
|
|
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();
|
|
@@ -219,7 +219,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);
|
|
}
|
|
|