TL; DR; Seu problema não está em executar a função de distância. Seu problema está executando a função de distância tantas vezes. Em outras palavras, você precisa de uma otimização algorítmica em vez de matemática.
[EDIT] Estou excluindo a primeira seção da minha resposta, porque as pessoas estão odiando. O título da pergunta pedia funções de distância alternativas antes da edição.
Você está usando uma função de distância na qual calcula a raiz quadrada sempre. No entanto, você pode simplesmente substituí-lo sem usar a raiz quadrada e calcular a distância ao quadrado. Isso economizará muitos ciclos preciosos.
Distância ^ 2 = x * x + y * y;
esse é realmente um truque comum. Mas você precisa ajustar seus cálculos de acordo. Também pode ser usado como verificação inicial antes de calcular a distância real.
Assim, por exemplo, em vez de calcular a distância real entre dois pontos / esferas para um teste de interseção, podemos calcular a Distância ao quadrado e comparar com o raio ao quadrado em vez do raio.
Edit, bem depois que @ Byte56 apontou que eu não li a pergunta e que você estava ciente da otimização da distância ao quadrado.
Bem, no seu caso, infelizmente, estamos na computação gráfica lidando quase exclusivamente com o Espaço Euclidiano , e a distância é exatamente definida como Sqrt of Vector dot itself
no espaço euclidiano.
Distância ao quadrado é a melhor aproximação que você obterá (em termos de desempenho), não consigo ver nada superando 2 multiplicações, uma adição e uma tarefa.
Então você diz que não posso otimizar a função de distância, o que devo fazer?
Seu problema não está em executar a função de distância. Seu problema está executando a função de distância tantas vezes. Em outras palavras, você precisa de uma otimização algorítmica em vez de matemática.
O ponto é, em vez de verificar a interseção do jogador com cada objeto na cena, cada quadro. Você pode usar facilmente a coerência espacial em seu proveito e verificar apenas os objetos que estão próximos ao player (com maior probabilidade de acertar / cruzar).
Isso pode ser feito facilmente, armazenando essas informações espaciais em uma estrutura de dados de particionamento espacial . Para um jogo simples, sugiro um Grid, porque é basicamente fácil de implementar e se encaixa perfeitamente na cena dinâmica.
Cada célula / caixa contém uma lista de objetos que a caixa delimitadora da grade inclui. E é fácil rastrear a posição do jogador nessas células. E para os cálculos de distância, você só verifica a distância do jogador com esses objetos dentro da mesma célula ou nas células vizinhas, em vez de tudo na cena.
Uma abordagem mais complicada é usar BSP ou Octrees.