有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java集合块Bukkit性能友好

我目前正在编写一个游戏,其中包括大量的区块设置。 当一个玩家移动时,一个彩色玻璃通道将引导并跟随他的方向,并在5秒后消失

我已经检查过了,如果没有设置,那么只会设置块,如果玩家实际上正在将他的位置更改为另一个块,那么只会检查块

我也尝试过使用sendBlockChange来实现这一点,但首先,这无助于提高性能,因为sendBlockChange必须应用于所有在线玩家,其次,反作弊插件将变得疯狂,我没有时间编写新的NCP

因此,我在这里发布了moveEvent期间的实际块设置,并希望在此提供一些建议,以降低性能

目前,一台服务器需要大约5GB的内存来容纳3-5个播放器

谢谢各位

public class MoveListener implements Listener {


    @EventHandler
    public void onMove(PlayerMoveEvent e) {


            Location l = e.getTo();
          if(Nyanfighters.getInstance().getSpawnpointsConfi().isSet("SpielSpawn.pos1.X"))
          {
              if(e.getFrom().getBlockY()<254&& YmlMethods.isInArea(e.getPlayer(),e.getPlayer().getLocation()) && !(e.getFrom().getBlockX() == e.getTo().getBlockX() && e.getFrom().getBlockY() == e.getTo().getBlockY() && e.getFrom().getBlockZ() == e.getTo().getBlockZ())){
                  if ((l.getYaw() <= -45 && l.getYaw() > -135.0) || (l.getYaw() <= 305 && l.getYaw() > 215)) {           
                      setArea2(-1, 1, l, e.getPlayer(), e.getPlayer().isSneaking());
                  } else if ((l.getYaw() <= -305 || (l.getYaw() > -45 && l.getYaw() <= 0)) || ((l.getYaw() <= 45 && l.getYaw() >= 0) || l.getYaw() > 305)) {
                      setArea(1, 1, l, e.getPlayer(), e.getPlayer().isSneaking());
                  } else if ((l.getYaw() <= -215 && l.getYaw() > -305) || (l.getYaw() <= 135 && l.getYaw() > 45)) {
                      setArea2(-1, 1, l, e.getPlayer(), e.getPlayer().isSneaking());
                  } else {
                      setArea(-1, -1, l, e.getPlayer(), e.getPlayer().isSneaking());
                  }
              }
          }




    }

    private void setArea(int x, int z, Location start, Player p, boolean sneak) {                                                      
        if (p.getLocation().getPitch()>75) {                                    
            setAir("start", 0, 0, start, 4);                                                                           
            setAir("left", x, 0, start, 14);
            //setAir("lefttwice", x * 2, 0, start, 14);
            setAir("right", -x, 0, start, 9);
            //setAir("righttwice", (-x) * 2, 0, start, 9);
            setAir("front", 0, z, start, 4);
            setAir("back", 0, -z, start, 4);
            setAir("leftfront", x, z, start, 14);
            //setAir("lefttwicefront", x * 2, z, start, 14);
            setAir("rightfront", -x, z, start, 9);
            //setAir("righttwicefront", (-x) * 2, z, start, 9);
            setAir("leftback", x, -z, start, 14);
            //setAir("lefttwiceback", x * 2, -z, start, 14);
            setAir("rightback", -x, -z, start, 9);
            //setAir("righttwiceback", (-x) * 2, -z, start, 9);
        } else {                                                                 
            setBlocks("start", 0, 0, start, 4);
            setBlocks("left", x, 0, start, 14);
            //setBlocks("lefttwice", x * 2, 0, start, 14);
            setBlocks("right", -x, 0, start, 9);
            //setBlocks("righttwice", (-x) * 2, 0, start, 9);
            setBlocks("front", 0, z, start, 4);
            setBlocks("back", 0, -z, start, 4);
            setBlocks("leftfront", x, z, start, 14);
            //setBlocks("lefttwicefront", x * 2, z, start, 14);
            setBlocks("rightfront", -x, z, start, 9);
            //setBlocks("righttwicefront", (-x) * 2, z, start, 9);
            setBlocks("leftback", x, -z, start, 14);
            //setBlocks("lefttwiceback", x * 2, -z, start, 14);
            setBlocks("rightback", -x, -z, start, 9);
            //setBlocks("righttwiceback", (-x) * 2, -z, start, 9);
        }
    }

    private void setArea2(int x, int z, Location start, Player p, boolean sneak) {                                                     
        if (p.getLocation().getPitch()>75) {                                                                       
            setAir("start", 0, 0, start, 4);                                                                       
            setAir("left", 0, x, start, 14);
            //setAir("lefttwice", 0, x * 2, start, 14);
            setAir("right", 0, -x, start, 9);
            //setAir("righttwice", 0, (-x) * 2, start, 9);
            setAir("front", z, 0, start, 4);
            setAir("back", -z, 0, start, 4);
            setAir("leftfront", z, x, start, 14);
            //setAir("lefttwicefront", z, x * 2, start, 14);
            setAir("rightfront", z, -x, start, 9);
            //setAir("righttwicefront", z, (-x) * 2, start, 9);
            setAir("leftback", -z, x, start, 14);
            //setAir("lefttwiceback", -z, x * 2, start, 14);
            setAir("rightback", -z, -x, start, 9);
            //setAir("righttwiceback", -z, (-x) * 2, start, 9);
        } else {
            setBlocks("start", 0, 0, start, 4);
            setBlocks("left", 0, x, start, 14);
            //setBlocks("lefttwice", 0, x * 2, start, 14);
            setBlocks("right", 0, -x, start, 9);
            //setBlocks("righttwice", 0, (-x) * 2, start, 9);
            setBlocks("front", z, 0, start, 4);
            setBlocks("back", -z, 0, start, 4);
            setBlocks("leftfront", z, x, start, 14);
            //setBlocks("lefttwicefront", z, x * 2, start, 14);
            setBlocks("rightfront", z, -x, start, 9);
            //setBlocks("righttwicefront", z, (-x) * 2, start, 9);
            setBlocks("leftback", -z, x, start, 14);
            //setBlocks("lefttwiceback", -z, x * 2, start, 14);
            setBlocks("rightback", -z, -x, start, 9);
            //setBlocks("righttwiceback", -z, (-x) * 2, start, 9);
        }
    }

    private void setBlocks(String s, int x, int z, Location start, int data) {                                            
        Location left = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 1, start.getBlockZ() + z);
        //Location leftair = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY(), start.getBlockZ() + z);
        /*if (leftair.getBlock().getType() == Material.AIR) {
            for (Player p : Bukkit.getOnlinePlayers())
                p.sendBlockChange(leftair, Material.AIR, (byte) id);
        }
        Location leftair2 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 1, start.getBlockZ() + z);
        if (leftair2.getBlock().getType() == Material.AIR) {
            for (Player p : Bukkit.getOnlinePlayers())
                p.sendBlockChange(leftair2, Material.AIR, (byte) id);
        }

        Location leftair3 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 2, start.getBlockZ());
        if (leftair3.getBlock().getType() == Material.AIR) {
            for (Player p : Bukkit.getOnlinePlayers())
                p.sendBlockChange(leftair3, Material.AIR, (byte) id);
        }*/
        Material block = left.getBlock().getType();
        if (block == Material.AIR) {
            left.getBlock().setType(Material.STAINED_GLASS);
            BlockState bs=  left.getBlock().getState();
            bs.setRawData((byte)data);
            bs.update();
            removeBlock(left);
        }
    }

    private void setAir(String s, int x, int z, Location start, int data) {                                               

        Location left = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 1, start.getBlockZ() + z);
        if (left.getBlock().getType() == Material.STAINED_GLASS)
            left.getBlock().setType(Material.AIR);
        /*Location leftair = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY(), start.getBlockZ() + z);
        if (leftair.getBlock().getType() == Material.AIR) {
            for (Player p : Bukkit.getOnlinePlayers())
                p.sendBlockChange(leftair, Material.AIR, (byte) id);
        }
        Location leftair2 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 1, start.getBlockZ() + z);
        if (leftair2.getBlock().getType() == Material.AIR) {
            for (Player p : Bukkit.getOnlinePlayers())
                p.sendBlockChange(leftair2, Material.AIR, (byte) id);
        }
        Location leftair3 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 2, start.getBlockZ());
        if (leftair3.getBlock().getType() == Material.AIR) {
            for (Player p : Bukkit.getOnlinePlayers())
                p.sendBlockChange(leftair3, Material.AIR, (byte) id);
        }*/
        Location right = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 3, start.getBlockZ() + z);
        Material block = right.getBlock().getType();
        if (block == Material.AIR) {
            right.getBlock().setType(Material.STAINED_GLASS);
            BlockState bs=  right.getBlock().getState();
            bs.setRawData((byte)data);
            bs.update();
            removeBlock(right);
        }
    }

    private void removeBlock(Location remove) {        
        Bukkit.getScheduler().scheduleSyncDelayedTask(Nyanfighters.getInstance(), () -> remove.getBlock().setType(Material.AIR), 20 * 5);
    }

}

注意:有一些代码括号作为注释标记。这些都是扩展,它们是目标,但尚未用于降低性能


共 (1) 个答案

  1. # 1 楼答案

    尝试在更新块之间实现一个小的等待时间。例如,玩家第一次触发块更新时,将条目存储在地图中,键入其UUID并使用当前时间值。然后,在下次激活事件时,检查当前时间与上次激活事件之间是否已过某个时间段。如果指定的时间没有过去,不要做任何事情。即使您将其更改为仍然每秒更新一次,也会比每滴答更新一次提高20倍