TL; DR; Ваша проблема не в выполнении функции расстояния. Ваша проблема заключается в выполнении функции расстояния так много раз. Другими словами, вам нужна алгоритмическая оптимизация, а не математическая.
[РЕДАКТИРОВАТЬ] Я удаляю первый раздел моего ответа, потому что люди ненавидят его. Заголовок вопроса спрашивал об альтернативных функциях расстояния до редактирования.
Вы используете функцию расстояния, где вы каждый раз вычисляете квадратный корень. Тем не менее, вы можете просто заменить это без использования квадратного корня и вычислить вместо этого квадрат в квадрате. Это сэкономит вам много драгоценных циклов.
Расстояние ^ 2 = х * х + у * у;
это на самом деле распространенный трюк. Но вам нужно соответствующим образом скорректировать свои расчеты. Его также можно использовать в качестве начальной проверки перед расчетом фактического расстояния.
Так, например, вместо того, чтобы вычислять фактическое расстояние между двумя точками / сферами для теста на пересечение, мы можем вместо этого вычислить Квадрат расстояния и сравнить с квадратом радиуса вместо радиуса.
Edit, задолго до того, как @ Byte56 указал, что я не читал вопрос, и что вы знали об оптимизации квадрата расстояния
Что ж, в вашем случае, к сожалению, мы в компьютерной графике почти исключительно имеем дело с евклидовым пространством , и расстояние точно определяется как Sqrt of Vector dot itself
в евклидовом пространстве.
Квадрат расстояния - это лучшее приближение, которое вы получите (с точки зрения производительности), я не вижу ничего, превосходящего 2 умножения, одно сложение и задание.
Итак, вы говорите, что я не могу оптимизировать функцию расстояния, что мне делать?
Ваша проблема не в выполнении функции расстояния. Ваша проблема заключается в выполнении функции расстояния так много раз. Другими словами, вам нужна алгоритмическая оптимизация, а не математическая.
Дело в том, что вместо проверки пересечения игрока с каждым объектом на сцене каждый кадр. Вы можете легко использовать пространственную согласованность в своих интересах и проверять только те объекты, которые находятся рядом с игроком (которые наиболее вероятно попадут / пересекаются).
Это может быть легко сделано путем фактического хранения этой пространственной информации в структуре данных с пространственным разделением . Для простой игры я бы предложил Grid, потому что он в основном прост в реализации и прекрасно вписывается в динамическую сцену.
Каждая ячейка / блок содержит список объектов, которые ограничивающий прямоугольник сетки содержит. И легко отслеживать положение игрока в этих ячейках. А для расчета расстояния вы проверяете расстояние игрока только с этими объектами внутри одной или соседних ячеек, а не со всей сцены.
Более сложный подход заключается в использовании BSP или Octrees.