고대 실을 부활 시켜서 죄송하지만 IMHO 평범한 오래된 격자는 이러한 경우에 자주 사용되지 않습니다. 셀 삽입 / 제거가 더러워지면 그리드에 많은 이점이 있습니다. 격자는 희소 표현을 최적화하는 것을 목표로하지 않기 때문에 셀 해제에 신경 쓸 필요가 없습니다. 쿼드 트리를 그리드로 교체하여 레거시 코드베이스에서 여러 요소를 선택하는 데 걸리는 시간을 1200ms 이상에서 20ms로 줄였습니다. 공평하게, 그 쿼드 트리는 실제로 구현이 제대로 이루어지지 않았으므로 요소에 대한 리프 노드 당 별도의 동적 배열을 저장했습니다.
내가 매우 유용하다고 생각하는 다른 하나는 도형을 그리기위한 클래식 래스터 화 알고리즘을 사용하여 그리드를 검색 할 수 있다는 것입니다. 예를 들어 Bresenham 선 래스터 화를 사용하여 선과 교차하는 요소를 검색하고 스캔 선 래스터 화를 사용하여 어떤 셀이 다각형과 교차하는지 등을 검색 할 수 있습니다. 격자에서 움직이는 물체에 대한 교차점을 감지하는 데 사용하면서 픽셀을 이미지에 플롯하는 데 사용하는 최적화 된 코드입니다.
그리드를 효율적으로 만들기 위해서는 그리드 셀당 32 비트 이상이 필요하지 않습니다. 4MB 이하로 백만 개의 셀을 저장할 수 있어야합니다. 각 그리드 셀은 셀의 첫 번째 요소를 인덱싱 할 수 있으며 셀의 첫 번째 요소는 셀의 다음 요소를 인덱싱 할 수 있습니다. 모든 단일 셀에 일종의 본격적인 컨테이너를 저장하는 경우 메모리 사용 및 할당이 폭발적으로 증가합니다. 대신 당신은 할 수 있습니다 :
struct Node
{
int32_t next;
...
};
struct Grid
{
vector<int32_t> cells;
vector<Node> nodes;
};
이렇게 :
좋아, 단점에. 나는 그리드에 대한 편견과 선호 로이 사실을 인정하고 있지만 그들의 주된 단점은 희소하지 않다는 것입니다.
좌표가 주어진 특정 그리드 셀에 액세스하는 것은 일정한 시간이며 더 저렴한 트리를 내릴 필요는 없지만 그리드가 밀도가 낮고 희박하지 않으므로 필요한 것보다 많은 셀을 확인해야 할 수 있습니다. 데이터가 매우 희소하게 분포 된 상황에서 그리드는 선이나 채워진 다각형, 사각형 또는 경계 원과 교차하는 요소를 파악하기 위해 더 많은 방법을 확인해야 할 수 있습니다. 그리드는 완전히 비어있는 경우에도 해당 32 비트 셀을 저장해야하며 모양 교차 쿼리를 수행 할 때 빈 셀이 모양과 교차하는지 확인해야합니다.
쿼드 트리의 주요 이점은 당연히 스파 스 데이터를 저장하고 필요한만큼만 세분화하는 기능입니다. 즉, 특히 모든 프레임 주위에서 움직이는 것이있는 경우 실제로 구현하기가 더 어렵습니다. 트리는 하위 노드를 매우 효율적으로 세분화하고 해제해야합니다. 그렇지 않으면 부모-> 자식 링크를 저장하기 위해 오버 헤드를 낭비하는 밀도가 높은 그리드로 저하됩니다. 그리드에 대해 위에서 설명한 것과 매우 유사한 기술을 사용하여 효율적인 쿼드 트리를 구현하는 것이 가능하지만 일반적으로 시간이 많이 걸립니다. 그리고 그리드에서 내가하는 방식으로 수행하면 쿼드 트리 노드의 4 명의 자식이 모두 연속적으로 저장되도록 보장 할 수있는 능력이 상실되므로 반드시 최적은 아닙니다.
또한 전체 장면의 많은 부분에 걸쳐 많은 수의 큰 요소가있는 경우 쿼드 트리와 그리드는 웅장한 작업을 수행하지 않지만 최소한 그리드는 평평하게 유지되고 이러한 경우 n 도로 세분화되지 않습니다 . 쿼드 트리는 요소를 분기에 저장해야하며 이러한 경우를 합리적으로 처리하기 위해 잎뿐만 아니라 미친 것처럼 세분화하고 품질을 매우 빠르게 저하 시키려고합니다. 가장 넓은 범위의 컨텐츠를 처리하려면 쿼드 트리로 처리해야 할 병리학 적 사례가 더 있습니다. 예를 들어, 실제로 쿼드 트리를 트립 할 수있는 또 다른 경우는 일치하는 요소의 보트로드가있는 경우입니다. 이 시점에서 일부 사람들은 쿼드 트리의 깊이 제한을 설정하여 무한히 세분화하는 것을 방지합니다. 그리드는 괜찮은 일을한다는 호소력이 있습니다.
안정성과 예측 가능성은 게임 상황에서도 유리합니다. 때로는 드문 경우 시나리오에서 프레임 속도가 가끔씩 빨라질 수 있기 때문에 일반적인 경우에 가능한 가장 빠른 솔루션을 원치 않을 수도 있기 때문입니다. 그러나 이러한 딸꾹질을 일으키지 않으며 프레임 속도를 부드럽고 예측 가능하게 유지합니다. 그리드에는 후자의 품질이 있습니다.
모든 말로, 나는 그것이 프로그래머에게 달려 있다고 생각합니다. grid vs. quad-tree 또는 octree vs. kd-tree vs. BVH와 같은 것들로, 내 투표는 어떤 데이터 구조를 사용하든 매우 효율적인 솔루션을 만드는 기록을 가진 가장 많은 개발자에게 있습니다. 멀티 스레딩, SIMD, 캐시 친화적 메모리 레이아웃 및 액세스 패턴과 같은 마이크로 레벨에도 많은 것들이 있습니다. 어떤 사람들은 그 마이크로를 고려할 수도 있지만 반드시 마이크로 영향을 줄 필요는 없습니다. 이러한 것들은 한 솔루션에서 다른 솔루션으로 100 배의 차이를 만들 수 있습니다. 그럼에도 불구하고 개인적으로 며칠이 주어졌고 모든 프레임 주위를 움직이는 요소의 충돌 감지를 빠르게 가속화하기 위해 데이터 구조를 구현해야한다고 들었다면 쿼드보다 그리드를 구현하는 짧은 시간에 더 나을 것입니다 -나무.