TL; DR; Twój problem nie polega na wykonywaniu funkcji odległości. Twoim problemem jest wykonywanie funkcji odległości tak wiele razy. Innymi słowy, potrzebujesz optymalizacji algorytmicznej, a nie matematycznej.
[EDYCJA] Usuwam pierwszą część mojej odpowiedzi, ponieważ ludzie jej nie znoszą. Tytuł pytania wymagał alternatywnych funkcji odległości przed edycją.
Korzystasz z funkcji odległości, w której za każdym razem obliczasz pierwiastek kwadratowy. Możesz jednak po prostu zastąpić to bez używania pierwiastka kwadratowego i zamiast tego obliczyć odległość do kwadratu. Pozwoli ci to zaoszczędzić wiele cennych cykli.
Odległość ^ 2 = x * x + y * y;
to właściwie wspólna sztuczka. Ale musisz odpowiednio dostosować swoje obliczenia. Można go również wykorzystać jako kontrolę wstępną przed obliczeniem rzeczywistej odległości.
Na przykład zamiast obliczać rzeczywistą odległość między dwoma punktami / sferami dla testu przecięcia, możemy zamiast tego obliczyć Odległość do kwadratu i porównać z promieniem do kwadratu zamiast promienia.
Edytuj, dobrze po tym, jak @ Byte56 zwrócił uwagę, że nie przeczytałem pytania i że byłeś świadomy optymalizacji kwadratu odległości.
W twoim przypadku niestety zajmujemy się grafiką komputerową prawie wyłącznie zajmującą się przestrzenią euklidesową , a odległość jest dokładnie zdefiniowana jak Sqrt of Vector dot itself
w przestrzeni euklidesowej.
Odległość do kwadratu to najlepsze przybliżenie, jakie uzyskasz (pod względem wydajności), nie widzę niczego, co przewyższyłoby 2 pomnożenia, jeden dodatek i zadanie.
Więc mówisz, że nie mogę zoptymalizować funkcji odległości, co powinienem zrobić?
Twój problem nie polega na wykonywaniu funkcji odległości. Twoim problemem jest wykonywanie funkcji odległości tak wiele razy. Innymi słowy, potrzebujesz optymalizacji algorytmicznej, a nie matematycznej.
Chodzi o to, aby zamiast sprawdzać skrzyżowanie gracza z każdym obiektem w scenie, każdą klatką. Możesz z łatwością wykorzystać spójność przestrzenną na swoją korzyść i sprawdzać tylko obiekty znajdujące się w pobliżu gracza (które najprawdopodobniej uderzą / przecinają się).
Można to łatwo zrobić, przechowując te informacje przestrzenne w strukturze danych z podziałem przestrzennym . W przypadku prostej gry sugerowałbym siatkę, ponieważ jest ona w zasadzie łatwa do zaimplementowania i ładnie pasuje do dynamicznej sceny.
Każda komórka / pudełko zawiera listę obiektów, które otaczają obwiednia siatki. I łatwo jest śledzić pozycję gracza w tych komórkach. A do obliczeń odległości sprawdzasz odległość gracza tylko z tymi obiektami w tej samej lub sąsiednich komórkach zamiast wszystkiego w scenie.
Bardziej skomplikowanym podejściem jest użycie BSP lub Octrees.