Görünüşe göre Ağaçlar hakkında bilgi edinmek istiyorsun!
Ve ciddi oluyorum, şu anda tüm küplerinizin bir dizisi üzerinde döngü yapıyorsanız, gerçekten çeşitli uzamsal veri yapılarına bakmalısınız. Bu durumda, küp dünyanızı yeniden hayal etmenin en iyi yolu bir ağaçtır.
Nedeninin nedenlerine girmeden önce sorunumuzu düşünelim. Mümkün olduğunca az maliyetle, oyuncunun çarpışabileceği yakındaki küplerin bir listesini alabileceğimiz bir çözüm arıyoruz. Bu liste olabildiğince küçük, ancak kesin olmalıdır.
Şimdi bu bölgeyi belirlemek için, oyuncumuzun koordinat alanını küp haritasının koordinat alanına eşlememiz gerekiyor; yani, oynatıcının kayan nokta konumunu çok boyutlu küp dizisinin ayrı bir dizinine eşlememiz gerekir (örnek gösterimi world[31][31][31]
, yani 64 * 64 * 64 çok boyutlu bir dizinin tam ortası olabilir ).
Sadece aynı yakındaki indekslemeyi kullanarak çevreleyen blokları hesaplayabiliriz, belki de sadece yakındaki küpleri örnekleyebiliriz, ancak bu yine de sürekli yeniden hesaplama gerektirir ve yerleşimde ayrık olmayan herhangi bir nesneye izin vermez (yani küple eşleşmeyebilir) ) map.
İdeal durum, küp haritamızın belirli bölümleri için küplerimizi içeren, bir dizi eşit şekilde bölünmüş bir kova kümesidir, bu nedenle çevreleyen alanı yeniden hesaplamak yerine, bu bölgelere girip çıkıyoruz . Önemsiz herhangi bir hesaplama için, verilerimizi böyle tutmak tüm küpleri ve sadece yakındaki bu bireysel kümeleri yinelemeyi ortadan kaldırabilir.
Soru şudur: Bunu nasıl uygularız?
64 * 64 * 64 dünyası için 8 * 8 * 8 bölgeye ayrıldığını hayal edin . Bu, dünyanızda eksen başına 8 bölge (X, Y, Z) olacağı anlamına gelir. Bu bölgelerin her biri, bu yeni basitleştirilmiş dizin tarafından kolayca alınabilen 8 küp içerecektir.
Yakınınızdaki bir dizi küp üzerinde bir işlem yapmanız gerekiyorsa, dünyanızdaki her küpü tekrarlamak yerine, bu bölgeler üzerinde yineleyerek orijinal 64 * 64 * 64 (262144) 'den maksimum yineleme sayısını sadece 520 (8 * 8 * 8 + 8).
Şimdi bu bölgeler dünyasından uzaklaşın ve bölgeleri daha büyük süper bölgelere yerleştirin ; burada her süper bölge 2 x 2 x 2 normal bölge içerir . Dünyanız şu anda 512 (8 * 8 * 8) içerdiği gibi bölgeler , biz 8 * 8 * 8 kırabilir bölgeleri 64 (4 * 4 * 4) içine süper bölgeleri 8 bölerek bölgeleri 2 tarafından bölgeleri başına süper bölge . Yukarıdan aynı mantığı uygulamak, süper bölgeyi bulmak için maksimum yinelemeleri 512'den 8'e düşürür ; ve daha sonra 64 maksimum işlem bulmak için bölgeyi(toplam maksimum 72)! Bunun sizi zaten çok fazla yinelemeden nasıl kurtardığını görebilirsiniz (262144: 72).
Eminim şimdi ağaçların ne kadar yararlı olduğunu görebilirsiniz. Her bölge , ağaç üzerindeki bir daldır ve her süper bölge bir önceki dal olarak bulunur. İhtiyacınız olanı bulmak için sadece ağacı geziyorsunuz; toplam maliyeti en aza indirmek için daha küçük veri kümeleri kullanmak.
Aşağıdaki şema konsepti görselleştirmenize yardımcı olacaktır. ( Wikipedia'dan görsel : Octrees ):
Yasal Uyarı:
Voksel dünyanızın sabit boyutlu çok boyutlu bir dizide düzenlendiği yukarıdaki gibi ideal bir kurulumda, sadece oyuncu konumunu sorgulayabilir, daha sonra çevreleyen blokları O (1) maliyetle endeksleyebilirsiniz! (Bkz. Olhovskys açıklaması) Ama dünyanızın bir voksel oyununda nadiren sabit büyüklükte olduğunu düşünmeye başladığınızda bu daha zor hale gelir; ve tüm süper bölgeleri HDD'den belleğe yükleyebilmek için veri yapınıza ihtiyacınız olabilir . Sabit boyutlu çok boyutlu bir dizinin aksine, ağaçlar kombine algoritmalar üzerinde çok fazla zaman harcamadan kolayca buna izin verir.