Paper/src/main/java/net/minecraft/server/Path.java
Travis Watkins 894ea06567 Reduce default size of path array. Addresses BUKKIT-1469.
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.
2012-05-31 19:55:28 -05:00

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;
}
}