0

基本的なチェックを行い、現在一連の条件を満たしているプレーヤーのリストを維持するために、毎秒 1 回更新される ArrayList があります。

これを行うための最高のパフォーマンスの方法は、2つの提案されたソリューションがあることだと思います。

public void update() {
    for (Player player : Bukkit.getOnlinePlayers()) {
        if (!playersOnLadder.contains(player)) {
            if (checkPlayerOnLadder(player)) {
                playersOnLadder.add(player);
            }
        } else {
            if (checkPlayerOnLadder(player)) {
                playersOnLadder.remove(player);
            }
        }
    }
}

public void update() {
            playersOnLadder.clear();

    for (Player player : Bukkit.getOnlinePlayers()) {
        if (checkPlayerOnLadder(player)) {
            playersOnLadder.add(player);
        }
    }
}

通常、この配列リストには常に約 75 人のプレイヤーがいます。「ラダーメソッドでプレイヤーをチェック」は次のようになります。

private boolean checkPlayerOnLadder(Player player) {
    int ladderAbsolute = this.getX()+this.getZ();
    int playerAbsolute = (int) player.getLocation().getX()+ (int) player.getLocation().getZ();

    //If the player is within 4 blocks (2 in each direction) of the ladder then return true.
    if (ladderAbsolute == playerAbsolute || (ladderAbsolute-2 > playerAbsolute && ladderAbsolute+2 < playerAbsolute)) {
        return true;
    } else {
        return false;
    }
}

HashSet に変換された EDITED

4

4 に答える 4

0

「75 人のプレイヤー」 + 「1 秒に 1 回」 => 先に進みましょう!

毎秒数ナノ秒を得ることができるかもしれません。これにより、コードが数 0.0000001% 速くなる可能性があります...

より高速なオプションはおそらく次のようになります (割り当ては一般にクリアよりも安価です):

public void update() {
    // pre sizing the list saves unnecessary resizing operations.
    playersOnLadder = new ArrayList<>(Bukkit.getOnlinePlayers());
    for (Player player : Bukkit.getOnlinePlayers()) {
        if (checkPlayerOnLadder(player)) {
            playersOnLadder.add(player);
        }
    } 
}
于 2013-10-15T22:04:05.683 に答える