geforkt von Mirrors/Paper
894ea06567
The Path object creates an array of 1024 PathPoint objects as the backing for a sorted queue but testing shows we tend to get only 80 or so entries in the array at most. To save memory this changes the default size of the array to 128. Changing it to 64 was considered but that triggered too many resizes which is detremental to performance.
129 Zeilen
2.8 KiB
Java
129 Zeilen
2.8 KiB
Java
package net.minecraft.server;
|
|
|
|
public class Path {
|
|
|
|
private PathPoint[] a = new PathPoint[128]; // CraftBukkit - reduce default size
|
|
private int b = 0;
|
|
|
|
public Path() {}
|
|
|
|
public PathPoint a(PathPoint pathpoint) {
|
|
if (pathpoint.d >= 0) {
|
|
throw new IllegalStateException("OW KNOWS!");
|
|
} else {
|
|
if (this.b == this.a.length) {
|
|
PathPoint[] apathpoint = new PathPoint[this.b << 1];
|
|
|
|
System.arraycopy(this.a, 0, apathpoint, 0, this.b);
|
|
this.a = apathpoint;
|
|
}
|
|
|
|
this.a[this.b] = pathpoint;
|
|
pathpoint.d = this.b;
|
|
this.a(this.b++);
|
|
return pathpoint;
|
|
}
|
|
}
|
|
|
|
public void a() {
|
|
this.b = 0;
|
|
}
|
|
|
|
public PathPoint b() {
|
|
PathPoint pathpoint = this.a[0];
|
|
|
|
this.a[0] = this.a[--this.b];
|
|
this.a[this.b] = null;
|
|
if (this.b > 0) {
|
|
this.b(0);
|
|
}
|
|
|
|
pathpoint.d = -1;
|
|
return pathpoint;
|
|
}
|
|
|
|
public void a(PathPoint pathpoint, float f) {
|
|
float f1 = pathpoint.g;
|
|
|
|
pathpoint.g = f;
|
|
if (f < f1) {
|
|
this.a(pathpoint.d);
|
|
} else {
|
|
this.b(pathpoint.d);
|
|
}
|
|
}
|
|
|
|
private void a(int i) {
|
|
PathPoint pathpoint = this.a[i];
|
|
|
|
int j;
|
|
|
|
for (float f = pathpoint.g; i > 0; i = j) {
|
|
j = i - 1 >> 1;
|
|
PathPoint pathpoint1 = this.a[j];
|
|
|
|
if (f >= pathpoint1.g) {
|
|
break;
|
|
}
|
|
|
|
this.a[i] = pathpoint1;
|
|
pathpoint1.d = i;
|
|
}
|
|
|
|
this.a[i] = pathpoint;
|
|
pathpoint.d = i;
|
|
}
|
|
|
|
private void b(int i) {
|
|
PathPoint pathpoint = this.a[i];
|
|
float f = pathpoint.g;
|
|
|
|
while (true) {
|
|
int j = 1 + (i << 1);
|
|
int k = j + 1;
|
|
|
|
if (j >= this.b) {
|
|
break;
|
|
}
|
|
|
|
PathPoint pathpoint1 = this.a[j];
|
|
float f1 = pathpoint1.g;
|
|
PathPoint pathpoint2;
|
|
float f2;
|
|
|
|
if (k >= this.b) {
|
|
pathpoint2 = null;
|
|
f2 = Float.POSITIVE_INFINITY;
|
|
} else {
|
|
pathpoint2 = this.a[k];
|
|
f2 = pathpoint2.g;
|
|
}
|
|
|
|
if (f1 < f2) {
|
|
if (f1 >= f) {
|
|
break;
|
|
}
|
|
|
|
this.a[i] = pathpoint1;
|
|
pathpoint1.d = i;
|
|
i = j;
|
|
} else {
|
|
if (f2 >= f) {
|
|
break;
|
|
}
|
|
|
|
this.a[i] = pathpoint2;
|
|
pathpoint2.d = i;
|
|
i = k;
|
|
}
|
|
}
|
|
|
|
this.a[i] = pathpoint;
|
|
pathpoint.d = i;
|
|
}
|
|
|
|
public boolean c() {
|
|
return this.b == 0;
|
|
}
|
|
}
|