Xử lý chuyển động với QuadTree


7

Tôi hiện có một thực QuadTreethể chứa tất cả các Thực thể của tôi. Nó hoạt động tốt và tôi đã tối ưu hóa nó khá tốt, nhưng một điều đau lòng là tôi đang gỡ bỏ và chèn vào nó gần như mọi khung hình. Một ít mã:

    entityMap.remove(it->second, it->second->getLastAABB()); // Removes the entity, getLastAABB is it's last location

    QuadTree* nearest = entityMap.getLowestRoot(moved);
    std::unordered_set<Locatable*> entities = nearest->getAll();
    for (auto itt = entities.begin(); itt != entities.end(); itt++) {
        AABB aabb = (*itt)->getAABB();
        if (aabb.collides(moved)) {
            // COLLISION
        }
    }

    entityMap.insert(it->second);

Mã đó được chạy 30 lần một giây. Tôi sử dụng một lá cờ bẩn để chỉ các thực thể đã di chuyển được xử lý. entityMapQuadTreechính nó

Bất kỳ lời khuyên để giảm insertremovecác cuộc gọi được đánh giá cao.

Câu trả lời:


2

Trái với niềm tin phổ biến, bạn có thể tối ưu hóa chức năng chèn cây tứ giác. Cách thực hiện phổ biến của insert, là duyệt từ gốc đến lá và tìm nút phù hợp nhất, trong phần mềm lập trình trò chơi 2 có một bài viết chi tiết về cách bạn có thể tìm thấy nút đó ngay lập tức, nếu bạn biết phạm vi của quatree (có thể được mở rộng đến octree) và phạm vi của hộp giới hạn đối tượng. Bằng cách này bạn có thể ngay lập tức xác định cấp độ và nút chứa hộp. May mắn thay bạn tìm thấy lời giải thích đầy đủ trong bài viết này.

Bạn cũng có thể theo dõi các hàng xóm của mỗi nút, do đó, khi một đối tượng di chuyển bạn biết nó sẽ đi đâu, điều này đặc biệt khi bạn có một quatree hoàn chỉnh, nếu không tôi đề nghị cách tiếp cận đầu tiên.


1

Tôi đoán điều đó insertremoveđi qua cây tứ giác từ gốc đến lá, và đó là lý do tại sao bạn quan tâm đến hiệu suất của nó?

(Nhân tiện, quy tắc ngón tay cái không bao giờ thực hiện bất kỳ sự tối ưu nào trừ khi bạn hỏi "tôi đã đo được vấn đề hiệu suất thực sự chưa" và có thể trả lời trong câu khẳng định.)

Trong các trò chơi, phần lớn chuyển động sẽ liên tục, nghĩa là các thực thể của bạn sẽ di chuyển từ một nút lá sang một nút lân cận. Bạn sẽ có một cây có lá liên kết, vì vậy ngay cả khi lá có chung tổ tiên rất xa, bạn chỉ cần theo các liên kết địa phương thay vì đi lên cây.


Vì vậy, bạn đề xuất một danh sách liên kết của QuadTree?
Mẹo48

@ Tips48 không, ý tôi là một cái cây nơi những chiếc lá có liên kết với hàng xóm của chúng, giống như cây B +
congusbongus
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.