Faydalarını kaybetmeden geometri / ağın birleştirilmesi


11

Three.js'de, çizim çağrılarının miktarını sınırlamak ve böylece performansı artırmak için geometriyi birleştirebiliriz. Tek bir malzeme ile yapılan basit bir testte, GTX660 GPU'mda 60.000 / saniyede 50.000 küp + gölge çizebilirim. Geometri birleştirme olmadan, 5.000 küp zaten bir soruna neden oldu.

Her küp ağını kendi başına oluşturmanın faydalarını nasıl koruyacağımı merak ediyorum. Örneğin, her şey bir geometriye birleştirildiğinde bir küp kafes nasıl seçilir? Varsayılan olarak bu elbette mümkün değildir.

Bu problem için ortak bir teknik var mı? Sonuçta birleştirmeden sonra bile tüm birleştirilmemiş kafes nesneleri var. Yani onları toplamak için kullanmanın bir yolu olmalı?

Özetle ne yapmak istiyorum

  • SimCity öğrenme amaçlı oyun gibi
  • Her ev bir küp örgüdür
  • 50.000 konut oluşturmak ve konut ekleyip çıkarabilmek
  • Fare imleci (toplama) ile ev seçimi mümkün olmalıdır

Bunun sizin için yararlı olup olmadığından emin değilim, ama bütünlük için bahsediyorum. Simplygon , indie geliştiricileri için telif tabanlı bir fiyatlandırma modeline sahiptir ve bu kafesin çoğunu tasarım zamanında birleştirme ve bölümleme yapabilir.
steeveeet

Yanıtlar:


11

Tamam anladım. Tüm geometriyi bir araya getirdikten sonra, hala bir dizide bireysel ağlar var. Bu yüzden, oluşturulmamış olsalar bile, bu kafesleri yeniden yayınlamak için kullanabilirim. Bunu fark etmem bir süre aldı.

resim açıklamasını buraya girin

Toplama için bu oktree uygulamasını kullanıyorum: http://threejs.org/examples/#webgl_octree_raycasting

Bu, güncelleme başına kavşak testlerini 50.000'den ~ 500'e düşürür. Oktree olmadan fps çok azalır.

Gördüğünüz turuncu toplama gövdesi, aslında değiştirilmiş malzeme ve değiştirilmiş boyut ile şimdi oluşturulmuş örgü (+1 çizim çağrısı).

resim açıklamasını buraya girin

Sanırım bir sonraki adım bir tür harita bölümlemesi uygulamak. Yani, birleştirilmiş geometriyi birkaç parçaya ayırın. Bunun nedeni, birleştirilmiş geometrinin çok miktarda köşeye sahip olmasıdır. Bu, haritayı% 99 ekran dışına taşırsam, grafik kartının hala tüm köşeleri işlemesi gerekir, çünkü geometri hala görüntüdedir, en azından% 1'i. Bu nedenle, parçalanırsa, yalnızca görünümdeki parçaların oluşturulması gerekir.


Bu anlayış için çok teşekkür ederim. Ben de bunu yapmak için bir yol bulmaya çalışıyorum ve ben burada çözüm en mükemmel olduğunu düşünüyorum! Ancak kısa soru: Yerel nesne listeniz için (yani Three.Object3D'ler), rayCaster.intersectObjects () işlevinin çalışması için ne tür özellikler gerekir?
AlvinfromDiaspar

Çok iyi yapmışsın.
ClassicThunder

Benzer bir sorunum var, ama bir şekilde r70 ile rekabete girme işini alamıyorum. Kutuları oluştururken ve birleştirirken özel bir şey yaptınız mı? Düğümleri oluşturmak ve birleştirmek için aşağıdaki kodu ( pastebin.com/PStaAF3P ) kullanıyorum, ancak raycaster'ın çalışmasını sağlamak için eksik bir şey olabilir mi?
fhahn

Kısa soru: Size çok benzer bir şey yapıyorum (geoJSON verilerine dayanan bir 3d harita). Metodunuzla, kamerayı her döndürdüğünüzde önceden var olan bina kafeslerini de döndürmeniz mi gerekiyor? Yoksa sahneye tek tek kutular mı ekliyorsunuz yoksa onları render etmiyor musunuz?
Spencer

@Spencer Döndürmeye gerek yok. Tek tek kutuları global dizide tutar ve sahneye yalnızca birleştirilmiş geometri eklerim. Daha sonra global dizideki nesneyle raycasting yapabilirsiniz, çünkü raycaster kamera matrisine ve her kutunun konumuna bağlıdır. Büyük olasılıkla en iyi yol değil, bu sadece benim için bir kavram kanıtıydı. Bu noktada artık three.js yapmıyoruz.
user990827

1

Toplama için her küpün kimliğini başka bir oluşturma hedefine oluşturabilir ve sadece imlecin kimlik değerinin ne olduğunu kontrol edebilirsiniz. Avantajı, toplama işleminin piksel mükemmel olması ve daha karmaşık geometri için de verimli bir şekilde çalışmasıdır.

Tüm nesneler aynı geometriye sahipse, anlık oluşturmayı kullanabilirsiniz. Bir akış geometriyi tanımlar, diğeri örnek başına özellikleri tanımlar (örn. Dönüşüm). Frustum culling için görünürlük testine dayalı olarak her kareyi örnek akışını oluşturmanız gerekir. Büyük miktarda nesneniz varsa, bu nesneleri gevşek bir oktree veya culling hızlandırmak için bir şey koymak isteyebilirsiniz.


0

Three.js'nin ayrıntılarından emin değilim, ancak genel olarak OpenGL'de iki olası performans domuzu akla geliyor:

  1. Örneklemeyi düşündünüz mü? Sadece bir çizim çağrısına ihtiyacınız olacak ve daha az VRAM kullanacaksınız.
  2. Toplama algoritmasına ciddi bir şekilde baktınız mı? Küpleriniz bir ağaç yerine bir listede sınırlayıcı hacimlere sahipse, bu büyüklükteki bir farkı açıklar.

0

Yapabileceğiniz bir başka yaklaşım, geometrinize bir köşe özelliği oluşturmak ve parça gölgelendiricinize vurgu mantığı koymaktır. Bellekte iki veri kopyası olmasını istemediğinizde son derece kullanışlıdır ve vurgulamanın nasıl uygulandığı konusunda daha fazla kontrole sahip olursunuz.

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.