나무에 대해 배우고 싶은 것 같습니다!
그리고 나는 심각합니다. 현재 모든 큐브의 배열을 반복하고 있다면 실제로 다양한 공간 데이터 구조를 조사해야합니다. 이 경우 큐브 세계를 다시 상상하는 가장 좋은 방법은 나무입니다.
이유에 대한 이유를 살펴보기 전에 문제에 대해 생각해 봅시다. 가능한 적은 비용으로 플레이어가 충돌 할 수있는 근처 큐브 목록을 검색 할 수있는 솔루션을 찾고 있습니다. 이 목록은 가능한 작지만 정확해야합니다.
이제이 영역을 결정하려면 플레이어의 좌표 공간을 큐브 맵의 좌표 공간에 매핑해야합니다. 즉, 플레이어의 부동 소수점 위치를 다차원 큐브 배열의 이산 인덱스에 매핑해야합니다 (예 : 표기법은 world[31][31][31]
64 * 64 * 64 다차원 배열의 정확한 중간).
우리는이 같은 이산 인덱싱을 사용하여 주변 블록을 간단히 계산할 수있을 것입니다. 아마도 근처 큐브 만 샘플링 할 것입니다. 그러나 여전히 일정한 재 계산이 필요하며 배치에서 불연속적인 개체는 허용하지 않습니다 (예 : 큐브에 매핑되지 않을 수 있음) 지도).
이상적인 상황은 큐브 맵의 특정 섹션에 대한 큐브 세트를 포함하는 버킷 세트이며 주변 영역을 다시 계산하는 대신 동일하게 나눠서 단순히 이러한 영역 으로 들어오고 나가는 것입니다 . 사소한 계산의 경우, 이와 같이 데이터를 보유하면 모든 큐브를 반복하고 근처에있는 개별 세트 만 제거 할 수 있습니다.
문제는 이것을 어떻게 구현 하는가입니다.
64 * 64 * 64 세계의 경우 8 * 8 * 8 영역으로 분류되었다고 상상해보십시오 . 이것은 여러분의 세계에서 축당 8 개의 존 (X, Y, Z)을 갖게됨을 의미합니다. 이 각 영역 에는 8 개의 큐브가 포함되어 있으며이 새로운 단순 인덱스로 쉽게 검색 할 수 있습니다.
월드의 모든 큐브를 반복하지 않고 근처의 큐브 세트에서 작업을 수행해야하는 경우 이러한 영역 을 반복하여 원래 64 * 64 * 64 (262144)에서 최대 반복 횟수를 세분화 할 수 있습니다. 단지 520 (8 * 8 * 8 + 8).
이제이 영역 세계에서 축소하고 영역 을 더 큰 수퍼 영역 에 배치하십시오 . 여기서 각 수퍼 존 은 2 * 2 * 2 정규 존을 포함 합니다. 현재 세계에 512 (8 * 8 * 8) 영역이 포함되어 있으므로 8 개의 영역 을 수퍼 영역 당 2 개의 영역 으로 나누어 8 * 8 * 8 영역 을 64 (4 * 4 * 4) 수퍼 영역 으로 나눌 수 있습니다 . 위에서 동일한 논리를 적용하면 최대 반복을 512에서 8로 나누고 수퍼 존 을 찾을 수 있습니다 . 그리고 진행 영역 을 찾기 위해 최대 64(총 최대 72)! 이것이 이미 많은 반복을 어떻게 절약하고 있는지 알 수 있습니다 (262144 : 72).
이제 나무가 얼마나 유용한 지 알 수있을 것입니다. 각 영역 은 트리의 분기이며 각 수퍼 영역 은 선행 분기입니다. 당신은 단순히 당신이 필요로하는 것을 찾기 위해 나무를 순회하고 있습니다; 더 작은 데이터 세트를 사용하여 전체 비용을 최소화합니다.
아래 다이어그램은 개념을 시각화하는 데 도움이됩니다. ( Wikipedia : Octrees의 이미지 ) :
기권:
위와 같이 이상적인 설정에서 복셀 월드가 이미 고정 크기의 다차원 배열로 배치되어 있으면 플레이어 위치를 쿼리 한 다음 주변 블록을 O (1) 비용으로 인덱싱 할 수 있습니다! (Ollovskys 설명 참조) 그러나 복셀 게임에서 세상의 크기가 거의 고정되어 있지 않다는 점을 고려하면 더욱 어려워집니다. HDD에서 메모리로 전체 수퍼 존 을로드 할 수 있도록 데이터 구조가 필요할 수 있습니다 . 고정 크기의 다차원 배열과 달리 트리는 결합 알고리즘에 너무 많은 시간을 소비하지 않고도이를 가능하게합니다.