TL; DR; Ваша проблема не у виконанні функції відстані. Ваша проблема полягає у виконанні функції відстані стільки разів. Іншими словами, вам потрібна алгоритмічна оптимізація, а не математична.
[EDIT] Я видаляю перший розділ своєї відповіді, тому що люди її ненавиджу. Заголовок питання перед редагуванням пропонував альтернативні функції дистанції.
Ви використовуєте функцію відстані, де кожен раз обчислюєте квадратний корінь. Тим не менш, ви можете просто замінити це, не використовуючи квадратний корінь і зовсім обчислити відстань у квадраті. Це заощадить вам безліч дорогоцінних циклів.
Відстань ^ 2 = x * x + y * y;
це насправді загальна хитрість. Але вам потрібно відповідно підкоригувати свої розрахунки. Він також може бути використаний як початкова перевірка перед розрахунком фактичної відстані.
Так, наприклад, замість обчислення фактичної відстані між двома точками / сферами для випробування на перетині ми можемо обчислити відстань у квадраті і порівняти з квадратом радіуса замість радіуса.
Редагуйте, після того як @ Byte56 зазначив, що я не читав питання, і що ви знаєте про оптимізацію квадратних відстаней.
Ну у вашому випадку, на жаль, ми в комп'ютерній графіці майже виключно маємо справу з евклідовим простором , і відстань точно визначена, як Sqrt of Vector dot itself
у евклідовому просторі.
Відстань у квадраті - найкраще наближення, яке ви збираєтесь отримати (з точки зору продуктивності), я не бачу нічого, що б'є 2 множення, одне додавання та завдання.
Так ви кажете, що я не можу оптимізувати функцію дистанції, що мені робити?
Ваша проблема не у виконанні функції відстані. Ваша проблема полягає у виконанні функції відстані стільки разів. Іншими словами, вам потрібна алгоритмічна оптимізація, а не математична.
Справа в тому, щоб замість перевірки перетину гравця з кожним об'єктом сцени, кожним кадром. Ви можете легко використовувати просторову когерентність на свою користь і перевіряти лише ті об'єкти, які знаходяться поруч із програвачем (які, швидше за все, потрапляють / перетинаються.
Це легко зробити, фактично зберігаючи цю просторову інформацію в структурі даних просторового розподілу . Для простої гри я б запропонував Grid, тому що це в основному легко реалізувати і добре підходить для динамічної сцени.
Кожна комірка / поле містить перелік об'єктів, до яких вкладається обмежувальне поле сітки. І легко відстежувати позицію гравця в цих клітинках. А для обчислення відстані, ви перевіряєте лише відстань гравця з тими об'єктами всередині однієї або сусідньої комірки замість усього, що знаходиться на сцені.
Складніший підхід - використовувати BSP або Octrees.