Quad Tree com muitos objetos em movimento

7

Eu tenho uma implementação Quad Tree que é muito útil para o que estou tentando fazer. Meu problema é que, quando minha janela de exibição tem muitos objetos, a atualização para a Quad Tree leva muito tempo.

É um fato conhecido que Quad Trees são lentas para objetos não estáticos. Tentei alguns métodos para acelerar as coisas, mas o fato é que preciso atualizar um grande número de objetos com muita frequência.

Existe um algoritmo melhor que eu deveria estar procurando? Existem algumas implementações derivadas de Quad Tree que você conhece e que podem ser úteis para mim?

jgallant
fonte
Você também pode procurar aqui: gamedev.stackexchange.com/questions/20011/…
zacharmarz

Respostas:

13

Como você está movendo objetos Quad Tree? O método mais simples (e mais lento) é remover o objeto e reinserir. O XNA Quad Tree de código aberto que eu e um amigo criamos faz um pouco de lógica quando um objeto se move:

If the object is still inside the same quad
    if the object fits into a child quad
        Add to child
Else
    move the object to the parent(s) until it fits, and optionally going back down into children

Se você já está fazendo algo assim, pode valer a pena procurar outros métodos de índice espacial, como Spatial Hashing .

John McDonald
fonte
Uau, isso é tão estranho. Eu me deparei com essa implementação momentos antes de você postar isso. Eu apenas comecei a implementar esta versão para ver se isso aceleraria as coisas para mim, e isso acontece. Este é um trabalho incrível.
precisa saber é o seguinte
11
@ Jon, Yay, estou feliz por poder ajudar. Aliás, havia um pequeno bug relacionado à movimentação da DLL lá em cima (r20), eu baixava a fonte (r22).
John McDonald
Oh eu baixei rev22 da fonte. Eu nem me incomodei com a DLL. Mas obrigado por apontar isso.
precisa saber é o seguinte
Porra, estou atualizando uma quantidade enorme de dados em todas as chamadas Update () e elas não estão atolando. Você é o cara.
precisa saber é o seguinte
Impressionante, deixe-me saber se você tiver algum problema com ele.
John McDonald
3

Uso limites para objetos e os insiro no quadrilátero mais profundo que os contém. (Eu nunca me senti confortável em tratar as coisas como pontos)

Para objetos em movimento rápido, que também são tipicamente pequenos, por exemplo, marcadores, calculo os limites do caminho para um número de passos de tempo ou tamanho máximo, de modo que amarrei uma bala por um retângulo maior em vez de um quadrado menor e não preciso mova-os quase com a mesma frequência.

Além disso, você pode otimizar o próprio código em movimento para mover o objeto de maneira inteligente, em vez de removê-lo e reinseri-lo.

Vai
fonte