如何加速While循环

问题描述 投票:0回答:1

我正在编写一个 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);”,因为我在某处读到它应该有所帮助,但它也没有做得更好

java plugins minecraft spigot
1个回答
0
投票

你的循环可能会运行无限多次,因为你“有可能”随机数生成器真的不走运。这也是它运行如此缓慢的原因:你是在拿性能做赌注。随机数生成器要么立即为您提供良好的结果并提前打破,要么需要一段时间才能发生。 一般来说,要不惜一切代价避免 while(true) 循环,因为在最坏的情况下,它们永远不会停止执行。相反,尝试使用 for 循环遍历您想要扫描的区域,停止使用随机并获得实际的有形性能结果。

“Thread.sleep(50)”解决方案不会

加速

线程,它让当前线程在继续执行之前等待 50 毫秒。这意味着:它使整个事情变得更慢。 真正提高性能的唯一方法是编写更优化的代码,在您的情况下,这将涉及摆脱随机(作为开始)。

© www.soinside.com 2019 - 2024. All rights reserved.