我正在编写一个 Spigot 插件,当玩家死亡时,它应该在随机位置复活玩家。 我有一个功能正在寻找一个“安全”的地方来复活,但正因为如此,服务器负载很重并且运行缓慢。 有没有办法优化一下功能,或者做点什么,让服务器在位置搜索时不降低TPS,或者让位置搜索更快?
代码:
private static List<Material> getBelow(){
List<Material> list = new ArrayList<>();
list.add(Material.NETHERRACK);
list.add(Material.NETHER_QUARTZ_ORE);
list.add(Material.NETHER_GOLD_ORE);
list.add(Material.SHROOMLIGHT);
list.add(Material.CRIMSON_NYLIUM);
list.add(Material.GRAVEL);
list.add(Material.BONE_BLOCK);
list.add(Material.BLACKSTONE);
list.add(Material.BASALT);
list.add(Material.GILDED_BLACKSTONE);
list.add(Material.POLISHED_BLACKSTONE_BRICKS);
list.add(Material.GLOWSTONE);
list.add(Material.CRACKED_POLISHED_BLACKSTONE_BRICKS);
list.add(Material.WARPED_WART_BLOCK);
list.add(Material.NETHER_WART_BLOCK);
list.add(Material.WARPED_NYLIUM);
list.add(Material.NETHER_BRICKS);
list.add(Material.SOUL_SAND);
list.add(Material.SOUL_SOIL);
list.add(Material.GOLD_BLOCK);
return list;
}
private static List<Material> getMid(){
List<Material> list = new ArrayList<>();
list.add(Material.RED_MUSHROOM);
list.add(Material.BROWN_MUSHROOM);
list.add(Material.WARPED_FUNGUS);
list.add(Material.CRIMSON_ROOTS);
list.add(Material.CRIMSON_FUNGUS);
list.add(Material.TWISTING_VINES);
list.add(Material.WARPED_ROOTS);
list.add(Material.NETHER_SPROUTS);
list.add(Material.WEEPING_VINES);
list.add(Material.AIR);
list.add(Material.NETHER_WART);
return list;
}
private static List<Material> getAbove(){
List<Material> list = new ArrayList<>();
list.add(Material.TWISTING_VINES);
list.add(Material.WEEPING_VINES);
list.add(Material.AIR);
return list;
}
public static Location safeLocationGen(Player p) {
World netherWorld = Bukkit.getWorlds().get(1);
if (netherWorld == null) {
p.sendMessage("The nether world does not exist!");
return null;
}
Location safeLocation, loc;
Random rand = new Random();
int y ;
double x, z;
Block mid, below, above;
Material netherrak = Material.NETHERRACK;
Material air = Material.AIR;
while (true){
x = rand.nextInt(1000);
z = rand.nextInt(1000);
y = rand.nextInt(120); // MIN = 32
safeLocation = new Location(netherWorld, x, y, z);
loc = safeLocation;
below = loc.add(0, -1, 0).getBlock();
above = loc.add(0, 1, 0).getBlock();
mid = safeLocation.getBlock();
if (getBelow().contains(below.getType()) && getMid().contains(mid.getType()) && getAbove().contains(above.getType())){
safeLocation.setX(safeLocation.getX() + 0.5);
safeLocation.setZ(safeLocation.getZ() + 0.5);
break;
}
}
return safeLocation;
}
我尝试使用人工智能来解决这个问题,但他们的方法更糟糕 我还尝试使用“Thread.sleep(50);”,因为我在某处读到它应该有所帮助,但它也没有做得更好
你的循环可能会运行无限多次,因为你“有可能”随机数生成器真的不走运。这也是它运行如此缓慢的原因:你是在拿性能做赌注。随机数生成器要么立即为您提供良好的结果并提前打破,要么需要一段时间才能发生。 一般来说,要不惜一切代价避免 while(true) 循环,因为在最坏的情况下,它们永远不会停止执行。相反,尝试使用 for 循环遍历您想要扫描的区域,停止使用随机并获得实际的有形性能结果。
“Thread.sleep(50)”解决方案不会
加速线程,它让当前线程在继续执行之前等待 50 毫秒。这意味着:它使整个事情变得更慢。 真正提高性能的唯一方法是编写更优化的代码,在您的情况下,这将涉及摆脱随机(作为开始)。