Kavram
Temel olarak, bir sahne grafiği, hiyerarşik olarak yapılandırılmış bir mekansal ilişki kümesini temsil eden iki yönlü bir asiklik grafikten başka bir şey değildir.
Vahşi doğada motorlar, belirtildiği gibi sahne grafiğine başka güzellikler ekleme eğilimindedir. Bunu et ya da inek olarak görüp görmemeniz, muhtemelen oradaki motor ve kütüphanelerdeki deneyiminize bağlıdır.
Hafif tutmak
Sahne grafiği düğümünüzün (kalbinde, uzamsal / topografik bir yapıdan ziyade topolojik bir yapıdır) sahip olduğu Unity3D stilini doğal olarak uzamsal parametreleri ve işlevselliği içeren olarak tercih ediyorum. Motorumda düğümlerim Unity3D'den bile daha hafiftir, burada süper sınıflardan / uygulanmış arayüzlerden pek çok gereksiz önemsiz üyeyi miras alırlar: İşte sahip olduklarım - alabildiğiniz kadar hafif:
- ebeveyn / çocuk işaretçi üyeleri.
- dönüşüm öncesi uzaysal parametre üyeleri: xyz konumu, eğim, yalpa ve yuvarlanma.
- bir dönüşüm matrisi; hiyerarşik bir zincirdeki matrisler, ağacı tekrar tekrar yukarı / aşağı yürüterek çok hızlı ve kolay bir şekilde çoğalabilir ve size bir sahne grafiğinin ana özelliği olan hiyerarşik mekansal dönüşümleri verir;
- yalnızca bu düğümün dönüşüm matrislerini
updateLocal()
güncelleyen bir yöntem
- bunu ve tüm soyundan gelen düğümleri
updateAll()
güncelleyen bir yöntem 'matrisleri dönüştürür
... ayrıca hareket denklemleri mantığı ve böylece düğüm sınıfımda hız / ivme üyelerini (doğrusal ve açısal) dahil ediyorum. Bundan vazgeçebilir ve isterseniz ana denetleyicinizde kullanabilirsiniz. Ama işte bu - gerçekten çok hafif. Unutma, bunları binlerce varlığa sahip olabilirsin. Önerdiğin gibi hafif tut.
Hiyerarşi Oluşturma
Diğer sahne grafiklerine atıfta bulunan bir sahne grafiği hakkında söyledikleriniz ... Yumruk çizgisini bekliyorum? Tabii ki yaparlar. Ana kullanımları bu. Herhangi bir düğümü başka bir düğüme ekleyebilirsiniz ve yeni dönüşümün yerel alanı içinde dönüşümler otomatik olarak yapılmalıdır. Tek yaptığınız bir işaretçi değiştirmek, etrafındaki verileri kopyaladığınız gibi değil! Bir işaretçiyi değiştirerek, daha derin bir sahne grafiğine sahip olursunuz. Proxy'leri kullanmak işleri daha verimli hale getirirse, elbette, ama ihtiyacı hiç görmedim.
Render ile İlgili Mantıktan Kaçının
Sahne grafiği düğüm sınıfınızı yazarken görüntülemeyi unutun, yoksa kendiniz için şeyleri karıştırırsınız. Önemli olan şey, bir veri modeline sahip olmanız - sahne grafiği olsun ya da olmasın - ve bazı uygulayıcılar bu veri modelini inceleyecek ve dünyadaki nesneleri buna göre inceleyecekler, 1, 2 , 3 veya 7 boyut. Yaptığım nokta şudur: Sahne grafiğinizi render mantığı ile kirletmeyin. Bir sahne grafiği, topoloji ve topografya ile ilgilidir - yani bağlantı ve mekansal özellikler. Bunlar simülasyonun gerçek halidir ve oluşturma yokluğunda bile vardır (bu, güneşin altında herhangi bir şekilde birinci şahıs görüşünden istatistiksel grafiğe metinsel bir tanımlamaya kadar herhangi bir şekilde olabilir). Düğümler oluşturma ile ilgili nesnelere işaret etmez - ancak bunun tersi doğru olabilir. Ayrıca şunu da düşün: Tüm ağacınızdaki her sahne grafiği düğümü tanınmaz. Birçoğu sadece konteyner olacak. Öyleyse neden bir gösterici-render-nesnesi için bellek ayırıyor? Hiç kullanılmamış bir işaretçi üyesi bile hafızayı alıyor. Bu yüzden işaretçi yönünü tersine çevirin: Render ile ilgili örnek veri modeline (sahne grafiği düğümünüz olabilir veya dahil olabilir) tam tersi DEĞİLDİR. Ve, denetleyici listenizde ilerlemenin kolay bir yolunu ancak ilgili görünüme erişmeyi istiyorsanız, O (1) okuma zamanına yaklaşan bir sözlük / karma tablo kullanın. Bu şekilde herhangi bir kirlenme yoktur ve simülasyon mantığınız hangi üreticilerin yerinde olduğu ile ilgilenmez, bu da günlerinizi ve gecelerinizi kodlar. Öyleyse neden bir gösterici-render-nesnesi için bellek ayırıyor? Hiç kullanılmamış bir işaretçi üyesi bile hafızayı alıyor. Bu yüzden işaretçi yönünü tersine çevirin: Render ile ilgili örnek veri modeline (sahne grafiği düğümünüz olabilir veya dahil olabilir) tam tersi DEĞİLDİR. Ve, denetleyici listenizde ilerlemenin kolay bir yolunu ancak ilgili görünüme erişmeyi istiyorsanız, O (1) okuma zamanına yaklaşan bir sözlük / karma tablo kullanın. Bu şekilde herhangi bir kirlenme yoktur ve simülasyon mantığınız hangi üreticilerin yerinde olduğu ile ilgilenmez, bu da günlerinizi ve gecelerinizi kodlar. Öyleyse neden bir gösterici-render-nesnesi için bellek ayırıyor? Hiç kullanılmamış bir işaretçi üyesi bile hafızayı alıyor. Bu yüzden işaretçi yönünü tersine çevirin: Render ile ilgili örnek veri modeline (sahne grafiği düğümünüz olabilir veya dahil olabilir) tam tersi DEĞİLDİR. Ve, denetleyici listenizde ilerlemenin kolay bir yolunu ancak ilgili görünüme erişmeyi istiyorsanız, O (1) okuma zamanına yaklaşan bir sözlük / karma tablo kullanın. Bu şekilde herhangi bir kirlenme yoktur ve simülasyon mantığınız hangi üreticilerin yerinde olduğu ile ilgilenmez, bu da günlerinizi ve gecelerinizi kodlar. Ve, denetleyici listenizde ilerlemenin kolay bir yolunu ancak ilgili görünüme erişmeyi istiyorsanız, O (1) okuma zamanına yaklaşan bir sözlük / karma tablo kullanın. Bu şekilde herhangi bir kirlenme yoktur ve simülasyon mantığınız hangi üreticilerin yerinde olduğu ile ilgilenmez, bu da günlerinizi ve gecelerinizi kodlar. Ve, denetleyici listenizde ilerlemenin kolay bir yolunu ancak ilgili görünüme erişmeyi istiyorsanız, O (1) okuma zamanına yaklaşan bir sözlük / karma tablo kullanın. Bu şekilde herhangi bir kirlenme yoktur ve simülasyon mantığınız hangi üreticilerin yerinde olduğu ile ilgilenmez, bu da günlerinizi ve gecelerinizi kodlar.dünyalar daha kolay.
Çıkarma gelince, yukarıya bakın. İlgi alanı toplama işlemi bir simülasyon mantığı konseptidir. Başka bir deyişle, dünyayı bunun dışında (genellikle kutulu, dairesel veya küresel) alanın dışında işlemezsiniz. Bu, oluşturma gerçekleşmeden önce ana denetleyici / oyun döngüsünde gerçekleşir. Öte yandan, frustum culling tamamen render ile ilgilidir. Öyleyse şu anda toplanmayı unut. Sahne grafikleriyle hiçbir ilgisi yok ve ona odaklanarak elde etmeye çalıştığınız şeyin gerçek amacını gizlemiş olacaksınız.
Son bir not ...
Burada bulunan görüntü oluşturma ile ilgili tüm ayrıntılar göz önüne alındığında, bir Flash (özellikle AS3) arkaplanından geldiğinize dair güçlü hisler alıyorum. Evet, Flash Stage / DisplayObject paradigması, senaryoun bir parçası olarak tüm oluşturma mantığını içerir. Ancak Flash, mutlaka yapmak istemediğiniz birçok varsayımda bulunur. Tam teşekküllü bir oyun motoru için, performans, kolaylık ve uygun karmaşıklıkta SoC ile kod karmaşıklığının kontrolü için ikisini karıştırmamak daha iyidir .