공간 해싱보다 쿼드 트리가 선호되는 경우는 언제입니까?


12

동시에 많은 객체로 2D 플랫 포머를 만들고 있습니다. 모두 AABB 충돌이 감지되었습니다. 먼저 검사 할 객체 수를 줄이기 위해 쿼드 트리를 시도하고 몇 가지 다른 구성을 시도했지만 필요한만큼 효과적이지는 않았습니다. 나는 공간 해시를 구현했으며 더 효율적입니다. 각 충돌을 확인하는 객체의 수가 크게 줄었습니다.

공간 해싱보다 쿼드 트리를 사용하여 2D 충돌 감지를 수행하는 것이 더 좋은 경우가 있습니까? 내 테스트에 따르면 공간 해싱은 항상 충돌 테스트를 위해 더 적은 수의 객체로 끝나는 것 같습니다.

알고리즘에 대한 타이밍을 수행하지는 않았지만 C로 코딩 할 때 해싱이 매우 비싸거나 구현하기가 어렵습니까? 주목할 점은 "무료로"해싱하는 자바 스크립트로 게임을 작성하고 있다는 것입니다.

비교는 다음과 같습니다. 무언가를 간과 했습니까? http://zufallsgenerator.github.io/2014/01/26/visually-comparing-algorithms/

답변:


12

쿼드 트리의 주요 장점은 전체 버킷 그룹을 매우 빠르게 고려할 수 없다는 것입니다.

예를 들어, 레벨이 6 개인 쿼드 트리가 있다고 가정 해 봅시다. 가장 낮은 수준에서는 32x32 상자입니다. 그 최하위 레벨을 구성하는 1024 개의 상자. 비교를 위해 32x32 박스, 총 1024 박스를 포함하는 플랫 그리드 인 "공간 해시"도 고려할 것입니다. (쿼드 트리에는 총 1024 개 이상의 상자가 있습니다. 더 높은 수준의 큰 상자도 포함하기 때문입니다)

시스템에 충돌 가능한 객체가 없다고 가정합니다. 쿼드 트리와 평면 그리드의 모든 상자가 완전히 비어 있습니다.

경계 상자가 모든 상자와 교차하기에 충분히 큰 물체의 충돌을 테스트하고 평면 격자를 사용하는 경우 1024 상자 중 하나를 모두 확인하여 그들.

그러나 중첩 쿼드 트리를 사용하는 경우 최상위 레벨은 시스템에 다른 객체가 없다는 것을 알 수 있으므로 충돌을 발견하지 않을 것임을 알기 위해 단일 상자 만 살펴 봐야합니다. 더 깊이있는 트리에서-즉시 테스트를 중단 할 수 있습니다.

마찬가지로 객체가 쿼드 트리의 특정 영역에만 존재하는 경우 쿼드 트리는 자연스럽게 관련성이있는 상자 만 검색하도록 안내하는 반면, 그리드는 사전에 알 수있는 방법이 없기 때문에 모든 교차 상자를 확인해야합니다. 어떤 그리드 사각형에 개체가 있을지 쿼드 트리의 대부분이 비어 있고 크고 복잡한 쿼리를 수행하는 경우 (예 : 작고 간단한 사각형 대신 큰 카메라 절두체) 작업을 수행하면 전체적으로 훨씬 적은 수의 상자를 반복하고 있음을 알 수 있습니다 평평한 격자가 아닌 나무 구조를 사용하여 무언가에 대해 테스트합니다. 그리고 그것은 큰 차이를 만들 수 있습니다.

물론 트리 구조가 항상 올바른 선택임을 암시하는 것은 아닙니다. 평평한 격자는 여러분의 사례에 이상적입니다. 전세계의 밀집된 구름이 고르게 분포되어 있으며, 간단하고 저렴한 충돌 테스트를 수행하고 있습니다. 이 경우 그리드가 최적의 방법 일 것입니다.


5
매우 게으른 게으른 요약 : 쿼드 트리는 다른 크기의 객체를 더 빠르게 처리합니다.
— Anko

감사합니다, 이것은 훌륭한 답변입니다! 물체의 균일 한 크기는 제가 생각했던 것입니다.
— Chris

실제로, 일반적으로 오브젝트가 없는지 확인하기 위해 일반적으로 모든 레벨의 쿼드 트리를 검색해야합니다. 레벨에는 일반적으로 레벨의 범위 안에 완전히 들어 맞고 하위 레벨에는 맞지 않는 오브젝트에 대한 정보 만 보유합니다.
— malthe

1
@malthe 이런 종류의 쿼리에서 일찍 시작할 수없는 쿼드 트리 구현을 사용하려면 공간 해시를 대신 사용하십시오. 메모리 비용의 33 %를 절약 할 수 있으며 어쨌든 이점을 얻지 못했을 것입니다. 또는 대안으로 아이디어의 순도를 느슨하게 풀고 각 노드가 자식의 엔터티 수를 추적하거나 빈 노드가있는 희소 쿼드 트리를 사용하여 조기에 시작할 수있는 쿼드 트리를 사용할 수 있습니다 필요할 때까지 나무에서 연결을 끊었습니다. 사실은. 5 년 후.
— 트레버 파월

물론 @TrevorPowell, 당신 말이 맞아요. 나는 단지 당신이 단지 하나의 상자 만보아야한다는 당신의 보증을 넘어 섰습니다. 당신이 그 수를 추구해야하기 때문에 이것은 사실이 아닙니다. 내가 알 수있는 한 충돌이 트리에서 더 높아지고 내려갈 수 있습니다.
— malthe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.