Tamamen dinamik KD-Ağacı mı Quadtree mi?


11

Oyunum üzerinde çalışırken, dünyadaki tüm birimleri takip etmem gereken noktadayım, böylece savaş için en yakın komşu kontrollerini yapabiliyorum. Bu, potansiyel olarak binlerce küçük otomatik ünitenin hareket ettiği RTS benzeri bir oyundur.

KD-Ağaçları ve Quadtrees (özellikle Point Quadtrees) bakıyorum. Hala nasıl çalıştıklarının ayrıntılarını öğrenmeye çalışıyorum, ama şimdiye kadar Point Quadtrees benim için en anlamlı olanı. Bununla birlikte, KD-Ağaçların aranması daha hızlı olduğu izlenimini edindim, bu da ağaçtaki puan sayısı ile önemlidir.

Öte yandan, benim durumumda, her zaman hareket eden çok sayıda birimi izleyeceğim . Çerçeveden çerçeveye, konumları her zaman farklı olacaktır. Quadtrees, yeniden dengelenme için KD-Ağaçlarından daha hızlıdır, ancak ağacın her noktasını yeniden dengelediğinizde bunun geçerli olup olmadığını bilmiyorum .

Bu durumda, ağaçtaki her bir noktayı yeniden dengelemeye çalışmak yerine, her kareyi hurdaya döküp sıfırdan yeniden inşa etmenin daha iyi olup olmayacağını merak ediyorum? Bir Quadtree yeniden dengelenmek için daha hızlıysa, bu sıfırdan inşa etmenin daha hızlı olduğu anlamına mı geliyor? Öyleyse, performans için ağacı oluşturmak ne kadar yük olduğuna bağlı olarak KD-Tree'nin arama hızından daha önemli olabilir, ama bilmiyorum ...

Yanıtlar:


12

KD ağaçları, dürüst olmak gerekirse, kesinlikle dikkate alınacak kadar dinamik değildir. Birkaç üniteyi taşımak, tüm KD Ağacını yeniden oluşturmanızı gerektirebilir. Ayrıca, KD-ağacı sorgular için çok etkilidir, ancak komşu arama için çok fazla değildir.

Bir dörtlü zaman içinde daha esnektir, çünkü değişiklik daha yerel tutulur. Dezavantajı, bir yerde sık sık hareket eden çok sayıda birim varsa, çok fazla alt bölümlere ayrılabilir ve birimlerin hareketi nedeniyle çok fazla güncelleme gerektirebilir. Alt bölümlerin oluşmayacağı bir eşik ayarlayabilirsiniz. Ancak dikkat edin, bu birçok birimin potansiyel olarak aynı yaprak karesinde olabileceğini ima eder.

Bununla birlikte, yalnızca sabit yarıçaplı r içindeki tüm birimleri bulmakla ilgileniyorsanız, hemen dörtlü ve kd ağacına ihtiyacınız yoktur. Sadece r uzunluğundaki bir 2B hücre dizisi oluşturabilir ve birimlerinizi konumlarına göre her bir hücrede istifleyebilirsiniz. Bu şekilde, aramak için daima en kötü 9 hücreniz olur. Senin haritasıdır Sadece eğer büyük , böyle bir ızgara uygulamak için çok büyük olacaktır.

Bahsetmediğimiz daha tamamen farklı iki yapı var: hiyerarşik AABB'ler ve yerel duyarlı karma tablo. Her bir hiyerarşik AABB'nin kaynağı, ana AABB'ye göre açıklanırsa, büyük bir birim grubu oluşumunu sürdürürse, aynı göreceli konumları korudukları için daha küçük AABB'leri güncellemeniz gerekmez. Tabii ki, formasyonu döndürmek birçok güncellemeye neden olabilir, bu durumda küreler veya yönlendirilmiş sınırlama kutuları (OBB) gibi diğer sınırlayıcı hacimlerin kullanımı daha verimli olabilir.

Yerel duyarlı karma tablolar sadece yaklaşık çözümler verimli bir şekilde verir, bu yüzden onlarla uğraşmak olmaz.

Ne yapardım ? Muhtemelen basit bir ızgarayla başlardım ve ihtiyacım olduğunda, bunu bir dörtlüğe yükseltirdim ve eğer ihtiyacım olursa, onu bir eşik altında sınırlayıcı bir hacim hiyerarşisiyle birleştiririm: dörtlü büyük bir işe yarar ölçek, göreceli sınırlayıcı hacimler küçük ölçekte iyi çalışır. Bunu yavaş yavaş yaparak, en iyi veri yapısını hemen elde etmek için baştan saat harcamak zorunda değilim .


Teşekkürler! Hiyerarşik AABB'leri ve yerel duyarlı hash tablolarını duymamıştım, gelecek için onlara bakacağım. Şimdilik basit bir ızgara ile gidiyorum ve gerekirse belirttiğiniz gibi genişleyeceğim. :)
Nairou

4

Lærne'nin önerileri harika, ama aynı zamanda AABB'lerin dinamik sınırlayıcı hacim ağacını da öneririm. Kavramsal olarak, dinamik sınırlayıcı hacim ağacı, bir AABB'den geçerek ve üst üste binen bir çifti alarak yakın elemanlar için herhangi bir zamanda sorgulanabilen dengeli bir düğüm ağacı tutar. Ağaç her kareyi yeniden oluşturmaz. Bunun yerine, her düğümün AABB'si ağaca konduğunda hafifçe şişirilir ve ağaç yalnızca düğümün gerçek AABB'si artık şişirilmiş AABB tarafından bulunmadığında yeniden oluşturulur. Fizik motorumda kullanıyorum ve harika çalışıyor.

Box2D kaynak kodunun büyük bir uygulaması var.

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

Uygulamalarının iyi bir incelemesi:

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


Evet, aşağı yukarı hiyerarşik AABB ile kastettiğim bu değildi, çok kesin değildim. Oh, ve RTSes biriminde genellikle hareketlidir, ancak oluşumlarda. Dolayısıyla, ana enflasyon AABB düğümüne göre koordinatları kullanmak "enflasyon" hata payı ile oldukça etkili olabilir.
Lærne

Google kod bağlantısını güncelleyebilir misiniz?
kolenda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.