Khi nào một tứ giác thích hợp hơn băm không gian?


11

Tôi đang tạo một platformer 2d với nhiều đối tượng cùng một lúc. Chúng đều được phát hiện va chạm AABB. Lần đầu tiên tôi đã thử một phần tư để giảm số lượng đối tượng cần kiểm tra, đã thử một vài cấu hình khác nhau, nhưng nó không chứng minh được hiệu quả như tôi cần. Tôi đã thực hiện một hàm băm không gian và nó hiệu quả hơn, số lượng đối tượng để kiểm tra cho mỗi vụ va chạm đã giảm mạnh.

Có trường hợp nào khi thực hiện phát hiện va chạm 2d bằng cách sử dụng một góc phần tư được ưu tiên hơn so với băm không gian không? Theo thử nghiệm của tôi, có vẻ như băm không gian luôn kết thúc với ít đối tượng được kiểm tra va chạm?

Tôi đã không thực hiện đúng thời gian trên các thuật toán, nhưng việc băm đơn giản là rất tốn kém hoặc khó thực hiện khi bạn, ví dụ, mã hóa bằng C? Đáng chú ý là tôi đang viết trò chơi bằng javascript, nơi bạn đã băm "miễn phí".

Đây là so sánh, tôi đã bỏ qua một cái gì đó? http://zufallsgenerator.github.io/2014/01/26/visual-compared-alerskyms/

Câu trả lời:


11

Ưu điểm chính của cây tứ giác là cho phép bạn loại bỏ toàn bộ các nhóm xô khỏi sự cân nhắc rất nhanh.

Ví dụ: giả sử rằng tôi có một cây tứ giác với sáu cấp độ. Ở mức thấp nhất, đó là 32x32 hộp; 1024 hộp bao gồm đáy đó, mức độ chi tiết nhất. Để so sánh, chúng tôi cũng sẽ xem xét "băm không gian" - một lưới phẳng cũng chứa 32x32 hộp, tổng cộng 1024 hộp. (cây quad có tổng cộng hơn 1024 hộp, vì nó cũng chứa các hộp lớn hơn ở cấp độ cao hơn)

Giả sử rằng không có vật thể nào có thể va chạm trong hệ thống - tất cả các hộp của cây tứ giác và lưới phẳng của chúng tôi hoàn toàn trống rỗng.

Nếu bạn đang kiểm tra sự va chạm của một cái gì đó đủ lớn để hộp giới hạn của nó giao với tất cả các hộp đó và bạn đang sử dụng một lưới phẳng, bạn phải kiểm tra từng hộp trong số 1024 hộp đó để xem liệu có bất kỳ thứ gì trong đó không họ

Nhưng nếu bạn đang sử dụng cây tứ giác lồng nhau, cấp độ cao nhất có thể cho bạn biết rằng không có đối tượng nào khác trong hệ thống, và vì vậy bạn chỉ cần nhìn vào hộp duy nhất đó để biết rằng bạn sẽ không tìm thấy va chạm sâu hơn trong cây - bạn có thể ngừng thử nghiệm ngay lập tức.

Tương tự, nếu các đối tượng chỉ tồn tại trong các vùng nhất định của cây tứ giác, cây tứ giác sẽ tự nhiên hướng dẫn tìm kiếm của bạn thông qua các hộp có khả năng liên quan, trong khi lưới yêu cầu bạn kiểm tra từng ô được giao nhau, bởi vì bạn không có cách nào để biết trước những ô vuông nào sẽ có đối tượng trong đó. Nếu phần lớn cây tứ giác của bạn trống và bạn đang thực hiện các truy vấn lớn, phức tạp (giả sử, máy ảnh lớn thay vì hình chữ nhật nhỏ, đơn giản), thì bạn có thể thấy rằng bạn đang lặp lại tổng số hộp ít hơn rất nhiều nếu bạn thực hiện kiểm tra một cái gì đó bằng cách sử dụng cấu trúc cây, thay vì lưới phẳng. Và điều đó có thể tạo ra một sự khác biệt lớn.

Tất cả những điều đó không có nghĩa là một cấu trúc cây luôn luôn là lựa chọn đúng đắn. Các lưới phẳng là lý tưởng cho tình huống bạn có trong ví dụ của bạn - những đám mây dày đặc của các vật thể trải đều ở khắp mọi nơi trên thế giới và chúng tôi đang thực hiện các thử nghiệm va chạm đơn giản, rẻ tiền. Hoàn toàn là một lưới có thể là phương pháp tối ưu trong trường hợp đó!


5
Tóm tắt Laconic, dành cho những người cực kỳ lười biếng: Quadtrees xử lý các đối tượng có kích thước khác nhau nhanh hơn.
Anko

Cảm ơn, đây là một câu trả lời tuyệt vời! Kích thước đồng đều của đồ vật là thứ mà tôi nghi ngờ.
Chris

Trên thực tế, thông thường bạn sẽ phải tìm kiếm trong tất cả các cấp độ của cây tứ giác để kiểm tra xem có chung không có đối tượng hay không, một cấp độ chỉ chứa thông tin về các đối tượng hoàn toàn nằm trong giới hạn của cấp độ đó và không phù hợp ở cấp độ thấp hơn.
Malthe

1
@malthe Nếu bạn khăng khăng sử dụng một triển khai cây bốn phương không thể sớm xuất hiện trong loại truy vấn này, thì hoàn toàn sử dụng hàm băm không gian thay thế; bạn sẽ tiết kiệm được 33% chi phí bộ nhớ và dù sao bạn cũng sẽ không nhận được lợi ích gì từ nó. Hoặc cách khác, bạn có thể nới lỏng độ tinh khiết trong ý tưởng của mình chỉ bằng một nụ cười và sử dụng một cây tứ giác có thể xuất hiện sớm, bằng cách cho mỗi nút theo dõi số lượng thực thể trong con của nó, hoặc bằng cách sử dụng một tứ giác thưa thớt sao cho các nút trống hủy liên kết từ cây cho đến khi họ cần. Thực ra. Hơn năm năm sau.
Trevor Powell

@TrevorPowell tất nhiên, bạn đúng. Tôi chỉ vượt qua sự đảm bảo của bạn rằng bạn chỉ phải nhìn vào một hộp duy nhất. Điều này không đúng vì bạn sẽ phải theo đuổi những tính toán đó. Bạn có thể tìm thấy những va chạm cao hơn và xa hơn trên cây xa như tôi có thể nói.
Malthe
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.