Более эффективный способ справиться с этим? - PullRequest
0 голосов
/ 30 января 2020

В настоящее время я работаю над расширением для онлайн-игры в Java. В настоящее время я занимаюсь телепортацией, чтобы узнать, телепортировался ли игрок на определенное расстояние, которое может быть от параметра distance.

Дело в том, что я знаю, что это очень интенсивная задача на процессоре, даже если я Я пытался разгрузить его из основного потока.

Был бы какой-нибудь более эффективный способ справиться с этим, или мне пришлось бы вообще реструктурировать все это?

this.square это просто математика .pow () ;, this.sqrt is Math.sqrt () ;, this.hypot выглядит следующим образом:

default double hypot(double... numbers) {
        double squaredSum = 0.0;

        int length = numbers.length;
        int count = 0;

        while (count < length) {
            double number = numbers[count];
            squaredSum += Math.pow(number, 2.0);
            ++count;
        }
        return this.sqrt(squaredSum);
    }

Вот как я проверяю, телепортируется ли игрок

public boolean anyNear(CustomLocation location, double distance) {
    if (!this.locations.isEmpty()) {
        Iterator<TeleportSnapshot> iterator = this.locations.iterator();

        if (iterator.hasNext()) {
            TeleportSnapshot teleport = iterator.next();

            double deltaX = location.getX() - teleport.x;
            double deltaY = location.getY() - teleport.y;
            double deltaZ = location.getZ() - teleport.z;

            while (!(this.hypot(deltaX, deltaY, deltaZ) < this.sqrt(this.square(distance)))) {
                if (iterator.hasNext()) {
                    teleport = iterator.next();
                    deltaX = location.getX() - teleport.x;
                    deltaY = location.getY() - teleport.y;
                    deltaZ = location.getZ() - teleport.z;
                } else {
                    return false;
                }
            }
            return true;
        } else {
            return false;
        }
    } else {
        return false;
    }

}

1 Ответ

1 голос
/ 03 февраля 2020

Я согласен с Дэвидом Циммерманом, вам, вероятно, не следует использовать квадрат root в своих вычислениях.

Вместо выполнения

sqrt(dx^2 + dy^2 + dz^2) < sqrt(distance^2),

вы можете использовать:

dx^2 + dy^2 + dz^2 < distance^2

, что гораздо более дружественно к процессору. Хотя название вашей вспомогательной функции для гипотенузы больше не подходит ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...