KD-Tree hoàn toàn năng động so với Quadtree?


11

Làm việc trong trò chơi của tôi, tôi đang ở điểm cần theo dõi tất cả các đơn vị trên thế giới để tôi có thể thực hiện kiểm tra hàng xóm gần nhất để chiến đấu. Đây là một trò chơi giống như RTS, với tiềm năng hàng ngàn đơn vị tự động nhỏ di chuyển xung quanh.

Tôi đã tìm hiểu về KD-Plants và Quadtrees (đặc biệt là Quadtrees Point). Tôi vẫn đang cố gắng tìm hiểu chi tiết về cách chúng hoạt động, nhưng cho đến nay Point Quadtrees đang có ý nghĩa nhất đối với tôi. Tuy nhiên, tôi có ấn tượng rằng cây KD nhanh hơn để tìm kiếm, điều này rất quan trọng với số điểm tôi sẽ có trong cây.

Mặt khác, trong trường hợp của tôi, tôi sẽ theo dõi một số lượng lớn các đơn vị luôn luôn di chuyển. Từ khung hình đến khung hình, vị trí của họ sẽ luôn khác nhau. Quadtrees rõ ràng là nhanh hơn để cân bằng lại so với KD-Tree, nhưng tôi không biết điều đó có áp dụng được không khi bạn cân bằng lại mọi điểm trên cây.

Tôi đang tự hỏi liệu trong trường hợp này sẽ tốt hơn nếu chỉ loại bỏ cây từng khung và xây dựng lại từ đầu, thay vì cố gắng cân bằng lại từng điểm trong cây? Nếu Quadtree nhanh hơn để tái cân bằng, điều đó cũng có nghĩa là nó nhanh hơn để xây dựng từ đầu? Nếu vậy, điều đó có thể quan trọng hơn đối với hiệu suất so với tốc độ tìm kiếm của KD-Tree, tùy thuộc vào mức độ gánh nặng của việc tạo ra cây, nhưng tôi không biết ...

Câu trả lời:


12

Cây KD chắc chắn không đủ năng động để được xem xét, trung thực. Di chuyển một vài đơn vị có thể dễ dàng yêu cầu bạn xây dựng lại toàn bộ KD-Tree. Thêm vào đó, một cây KD rất hiệu quả cho các truy vấn, nhưng không nhiều cho việc tìm kiếm hàng xóm.

Một tứ giác linh hoạt hơn theo thời gian, vì sửa đổi được giữ cục bộ hơn. Nhược điểm là nếu bạn có nhiều đơn vị tại một nơi thường xuyên di chuyển, nó có thể chia nhỏ quá nhiều và yêu cầu nhiều cập nhật do sự di chuyển của các đơn vị. Bạn có thể đặt ngưỡng theo đó, không có phân khu nào có thể xảy ra. Nhưng hãy cẩn thận, điều đó ngụ ý rất nhiều đơn vị có khả năng nằm trong cùng một hình vuông lá.

Tuy nhiên, nếu bạn chỉ muốn tìm tất cả các đơn vị trong bán kính r không đổi , bạn không cần phải có cây tứ giác và cây kd ngay lập tức. Bạn có thể chỉ cần tạo một mảng 2D của các ô có độ dài r và xếp các đơn vị của bạn trong mỗi ô theo vị trí của chúng. Bằng cách đó, bạn luôn có 9 ô tồi tệ nhất để tìm kiếm. Chỉ khi bản đồ của bạn lớn , một lưới như vậy sẽ quá lớn để thực hiện.

Có hai cấu trúc hoàn toàn khác nhau mà chúng tôi đã không nói đến: AABB phân cấp và bảng băm nhạy cảm cục bộ. Nếu nguồn gốc của mỗi AABB phân cấp được mô tả liên quan đến AABB gốc, thì có một lợi thế là nếu một nhóm lớn đơn vị giữ được sự hình thành của nó, thì bạn không cần cập nhật các AABB nhỏ hơn vì chúng giữ các vị trí tương đối giống nhau. Tất nhiên, xoay vòng đội hình có thể gây ra nhiều cập nhật, trong trường hợp đó, việc sử dụng các khối lượng giới hạn khác như hình cầu hoặc hộp giới hạn định hướng (OBB) có thể hiệu quả hơn.

Các bảng băm nhạy cảm cục bộ chỉ cung cấp các giải pháp gần đúng một cách hiệu quả, vì vậy tôi sẽ không bận tâm với chúng.

Tôi sẽ làm gì ? Có lẽ tôi bắt đầu với một lưới đơn giản, và khi tôi cần nó, tôi sẽ nâng cấp nó lên một hình tứ giác và nếu tôi cần, tôi sẽ kết hợp nó với một hệ thống phân cấp âm lượng giới hạn dưới một số ngưỡng: tứ giác hoạt động tốt ở mức lớn quy mô, khối lượng giới hạn tương đối hoạt động tốt ở quy mô nhỏ. Làm điều đó dần dần, tôi không phải mất hàng giờ từ đầu để có được cấu trúc dữ liệu tốt nhất ngay lập tức .


Cảm ơn! Tôi đã không nghe nói về AABB phân cấp và các bảng băm nhạy cảm cục bộ, tôi sẽ xem xét chúng trong tương lai. Bây giờ tôi sẽ sử dụng một lưới đơn giản và sẽ mở rộng nếu cần, như bạn đã đề cập. :)
Nairou

4

Gợi ý của Lærne là tuyệt vời, nhưng tôi cũng sẽ đề xuất một cây khối lượng giới hạn động của AABBs. Về mặt khái niệm, cây khối lượng giới hạn động giữ một cây nút cân bằng có thể được truy vấn bất cứ lúc nào đối với các phần tử gần bằng cách chuyển vào AABB và truy xuất một cặp chồng chéo. Cây không được xây dựng lại mỗi khung. Thay vào đó, AABB của mỗi nút bị thổi phồng nhẹ khi đưa vào cây và cây chỉ được xây dựng lại bất cứ khi nào AABB thực tế của nút không còn được chứa bởi AABB bị thổi phồng. Tôi sử dụng nó trong động cơ vật lý của tôi và nó hoạt động rất tốt.

Mã nguồn Box2D có một triển khai tuyệt vời của nó.

https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Collision/b2DocateTree.h

Đây là một đánh giá tốt về việc thực hiện của họ:

http://www.randygaul.net/2013/08/06/dynamic-aabb-tree/


Vâng, đó ít nhiều là những gì tôi muốn nói về AABB phân cấp, tôi không chính xác lắm. Oh, và trong đơn vị RTSes thường là điện thoại di động, nhưng trong hình thành. Vì vậy, sử dụng tọa độ liên quan đến nút AABB gốc có thể khá hiệu quả, với tỷ lệ lỗi "lạm phát".
Lrne

Bạn có thể cập nhật liên kết mã Google?
kolenda
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.