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


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.