Fix some performance regression in last patch
Dieser Commit ist enthalten in:
Ursprung
e5d57793d2
Commit
ecf97ddca0
@ -1,4 +1,4 @@
|
|||||||
From 3facd0493823185b7d706fdea5f69d1aa4a0471b Mon Sep 17 00:00:00 2001
|
From 6b1a04d156cb28c9c7c99de5dcb2c420936ebd0d Mon Sep 17 00:00:00 2001
|
||||||
From: Colin Godsey <crgodsey@gmail.com>
|
From: Colin Godsey <crgodsey@gmail.com>
|
||||||
Date: Wed, 8 Aug 2018 10:10:06 -0600
|
Date: Wed, 8 Aug 2018 10:10:06 -0600
|
||||||
Subject: [PATCH] Cache World Entity Type counts
|
Subject: [PATCH] Cache World Entity Type counts
|
||||||
@ -7,10 +7,10 @@ Optimizes mob spawning by keeping a count of entities by type
|
|||||||
|
|
||||||
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java b/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java b/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000000..f7b65ccf73
|
index 0000000000..35104542c5
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldEntityList.java
|
||||||
@@ -0,0 +1,114 @@
|
@@ -0,0 +1,121 @@
|
||||||
+package com.destroystokyo.paper;
|
+package com.destroystokyo.paper;
|
||||||
+
|
+
|
||||||
+import net.minecraft.server.Entity;
|
+import net.minecraft.server.Entity;
|
||||||
@ -45,15 +45,13 @@ index 0000000000..f7b65ccf73
|
|||||||
+
|
+
|
||||||
+ @Override
|
+ @Override
|
||||||
+ public boolean removeAll(Collection<?> c) {
|
+ public boolean removeAll(Collection<?> c) {
|
||||||
+ // TODO: Optimize this
|
|
||||||
+ boolean removed = false;
|
|
||||||
+ for (Object e : c) {
|
+ for (Object e : c) {
|
||||||
+ if (remove(e)) {
|
+ if (e instanceof Entity && ((Entity) e).getWorld() == world) {
|
||||||
+ removed = true;
|
+ updateEntityCount((Entity) e, -1);
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ return removed;
|
+ return super.removeAll(c);
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ @Override
|
+ @Override
|
||||||
@ -110,12 +108,21 @@ index 0000000000..f7b65ccf73
|
|||||||
+ if (entity instanceof EntityInsentient) {
|
+ if (entity instanceof EntityInsentient) {
|
||||||
+ EntityInsentient entityinsentient = (EntityInsentient) entity;
|
+ EntityInsentient entityinsentient = (EntityInsentient) entity;
|
||||||
+ if (amt > 0 && entityinsentient.isDespawnableByDefault() && entityinsentient.isPersistent()) {
|
+ if (amt > 0 && entityinsentient.isDespawnableByDefault() && entityinsentient.isPersistent()) {
|
||||||
+ entityinsentient.countsAgainstSpawnLimit = false;
|
|
||||||
+ return;
|
|
||||||
+ } else if (amt < 0 && !entityinsentient.countsAgainstSpawnLimit) {
|
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
|
+ if (amt < 0) {
|
||||||
|
+ if (!entity.hasBeenCounted) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ // Only remove once, we remove from if the entity list is guarded, but may be called later
|
||||||
|
+ entity.hasBeenCounted = false;
|
||||||
|
+ } else {
|
||||||
|
+ if (entity.hasBeenCounted) {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ entity.hasBeenCounted = true;
|
||||||
|
+ }
|
||||||
+
|
+
|
||||||
+ for (EnumCreatureType type : EnumCreatureType.values()) {
|
+ for (EnumCreatureType type : EnumCreatureType.values()) {
|
||||||
+ if (type.matches(entity)) {
|
+ if (type.matches(entity)) {
|
||||||
@ -125,19 +132,23 @@ index 0000000000..f7b65ccf73
|
|||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+}
|
+}
|
||||||
|
diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
|
||||||
|
index 41a951d580..03d54a7ef4 100644
|
||||||
|
--- a/src/main/java/net/minecraft/server/Entity.java
|
||||||
|
+++ b/src/main/java/net/minecraft/server/Entity.java
|
||||||
|
@@ -123,6 +123,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
|
||||||
|
private boolean az;
|
||||||
|
public boolean dead;
|
||||||
|
public boolean shouldBeRemoved; // Paper
|
||||||
|
+ public boolean hasBeenCounted = false; // Paper
|
||||||
|
public float width;
|
||||||
|
public float length;
|
||||||
|
public float J;
|
||||||
diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java
|
diff --git a/src/main/java/net/minecraft/server/EntityInsentient.java b/src/main/java/net/minecraft/server/EntityInsentient.java
|
||||||
index 903434e5f4..0ad5e1ab47 100644
|
index 903434e5f4..68765d2aad 100644
|
||||||
--- a/src/main/java/net/minecraft/server/EntityInsentient.java
|
--- a/src/main/java/net/minecraft/server/EntityInsentient.java
|
||||||
+++ b/src/main/java/net/minecraft/server/EntityInsentient.java
|
+++ b/src/main/java/net/minecraft/server/EntityInsentient.java
|
||||||
@@ -42,6 +42,7 @@ public abstract class EntityInsentient extends EntityLiving {
|
@@ -614,6 +614,7 @@ public abstract class EntityInsentient extends EntityLiving {
|
||||||
public float[] dropChanceArmor;
|
|
||||||
// public boolean canPickUpLoot; // CraftBukkit - moved up to EntityLiving
|
|
||||||
public boolean persistent;
|
|
||||||
+ public boolean countsAgainstSpawnLimit = true; // Paper
|
|
||||||
private final Map<PathType, Float> bH;
|
|
||||||
public MinecraftKey bI; // CraftBukkit private -> public
|
|
||||||
public long bJ; // CraftBukkit private -> public
|
|
||||||
@@ -614,6 +615,7 @@ public abstract class EntityInsentient extends EntityLiving {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren