mirror of
https://github.com/Winds-Studio/Leaf.git
synced 2025-12-19 15:09:25 +00:00
73 lines
3.4 KiB
Diff
73 lines
3.4 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>
|
|
|
|
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..877d2095a066854939f260ca4b0b8c7b5abb620f 100644
|
|
--- a/src/main/java/ca/spottedleaf/moonrise/common/list/IteratorSafeOrderedReferenceSet.java
|
|
+++ b/src/main/java/ca/spottedleaf/moonrise/common/list/IteratorSafeOrderedReferenceSet.java
|
|
@@ -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);
|
|
}
|
|
|