Ağaç işleme performansının etkisini nasıl azaltabilirim?


24

Düşük Poli stilize edilmiş bir oyun yapıyorum. Biraz su ile bir arazim var ve çok ve çok ağaç istiyorum; Şu anda 10,000 ağaç kütlesi yerleştirdim. Her ağaç 200'den fazla üçgen içermez, bu yüzden fazla vergi almazlar.

Asıl sorun, göller var ve göller oldukça büyük. Aslında gölün diğer tarafında hiç ağaç göremezsiniz ve bu gerçekten kötü görünüyor, özellikle de oraya yürüdüğünüzde ve ağaçlar aniden ortaya çıktığında.

Bunu düzeltmek için, gölün diğer tarafında düzgün miktarda ağaç görebilmeniz için ağaç mesafesini arttırmam gerekiyor, ancak performansı 40-50fps'ye düşürüyor ve oyunda henüz başka bir şey yok. Bir yardımı olursa GTX 1080 kullanıyorum.

Oyunumun daha fazla ağaçla daha hızlı çalışmasını sağlamak için ne yapabilirim?


IIRC, Silent Hill, uzaktaki kırpma düzlemindeki kesimi gizlemek için sis kullandı ve bu da sisin kesildiği yerin hemen dışındaki şeyleri dinamik olarak yüklemeye başladı. Oyunun atmosferindeki bir değişiklikten yararlanabilirsiniz.
Cody

Ağaçlar sizi pencereden dışarı çekmek için çekiyor, böylece performansınız düşüyor.
mbomb007

Profil oluşturucuyu çalıştırmayı denedin mi? Eğer öyleyse, darboğaz nerede?
Mikael Högström

Herhangi bir frustum culling yapıyor musunuz?
Krythic

Frustum culling nedir?
mr-matt

Yanıtlar:


43

Çizim performansını artırmak için yapabileceğiniz birkaç şey var.

  1. Çok uzak olduklarını söyledin. Bu ağaçların verteks sayısını azaltmak için LOD kullanabilirsiniz ve böylece çekilen tüm köşeleri geçmek için gereken süreyi azaltır. Her ne kadar elimizdeki sorun bu olmasa da (her biri 200 tris olan sadece 10k ağaçlı GTX1080, gpu için cılız numaralar) hala ekledim. Billboard, en düşük LOD seviyesi için etkili bir araçtır, çünkü esasen ağacın üzerinde render bir görüntüye sahip olan her zaman kameraya bakan düz bir düzlemdir. Derinlik hissini kaybeder, bu nedenle en düşük seviye için iyidir çünkü oyuncu muhtemelen farkı fark etmez.

  2. Gruplamayı etkinleştirdiniz mi? Dinamik kümeleme genellikle, kafeslerin tepe sayısı oldukça düşükse, otomatik olarak yapılır. Statik gruplama, ağaçları ana gameobject üzerindeki birlik editöründeki onay kutusunu işaretleyerek statik hale getirerek de denenebilir. Bu, hareketli nesnelerle iyi çalışmaz. Bu işi yapmak için paylaşılan malzemeye sahip nesnelere ihtiyacınız var.

  3. Özel gruplama, birliğin ele almasına izin vermek yerine, parçaları kendiniz oluşturarak görüntülemeyi denetlemenizi sağlar ve ayrıca daha büyük kafesler için gruplamayı da sağlar. Bu kolayca Mesh.CombineMeshes tarafından yapılır . Bu aynı zamanda animasyonlu nesnelerle iyi çalışmaz. Bu işi yapmak için paylaşılan malzemeye sahip nesnelere ihtiyacınız var. Muhtemelen dünyanı bir tür parçalara bölmek ve onlardan gruplar oluşturmak istiyorsun. Bu parçaların nasıl üretilmesi gerektiği, kameranızın dünyada nasıl hareket ettiğine bağlıdır.

  4. Etkin örneklilik shader üzerinde. Örnekleme, motorun sadece bir beraberlik çağrısı ile birden fazla nesne (aynı ağ ile) çizmesini sağlar. Bunun çalışması için nesnelerin paylaşılmış ağa ve paylaşılan gölgelendiriciye sahip olması gerekir. Malzeme değişebilir, ancak gölgelendirici tüm farklı değişken özellikleri desteklemelidir.

    Motorun daha iyi örnekleme oluşturma grupları oluşturmasını sağlamak için, aynı ağları sahnede birlikte gruplamak istersiniz. Ayrıca bir malzeme her zaman aynı malzemeye sahipse malzeme oluşturma kuyruğu ile oynamak size iyi sonuçlar verecektir. Geliştirme sırasında şu anda üzerinde çalışmakta olduğum mobil oyunun, test sahnemdeki çekmeceleri yarıdan fazla azaltmak için bunu kullandım. Ayrıca Unity 5.6'dan beri Enable Instancing, malzemedeki onay kutusunu işaretlediğinizden emin olun .

  5. Çekme ve tutma setlerinizi genel olarak düşük tutun. Bunlar GPU'nuzun bir şeyler çizmesi için yapılan ham çağrılardır ve büyük bir ek yükleri vardır. Çekme güçlüklerinin azaltılması (toplu işlem ve instancing ne yapıyorsa) CPU'nuzun daha az beklemesini gerektirdiği için sağlayabileceği performansı artırır. SetPass çağrıları mevcut gölgelendiricinizdeki değişikliklerdir, bu nedenle birçok farklı malzemeniz varsa, CPU'nun da biraz beklemesine neden olan birden fazla SetPass çağrısına sahip olursunuz.

  6. Sahneniz çok büyükse ve CPU zamanınız sahnedeki tüm nesnelerin içinden geçiyorsa sahnedeki nesneleri azaltmaya çalışın. Bazı ağaçları tek tek yerleştirmek yerine gruplandırın ve tek bir nesne olarak bulundurun. Ayrıca ağaçları veya ana nesneleri taşımadığınızdan emin olun, çünkü Unity'yi önbelleğe alınmış dönüşümleri atma ve tüm sahne ağacını yeniden hesaplama yapma gibi yapar.

  7. Sahneniz çok büyükse ve CPU zamanınız hala tüm nesneleri oluşturmak için listeler yapmak üzere sahne ağacında yürürken Unity'ye giriyorsa, yapabileceğiniz tek şey, Birliğin renderle başa çıkmasına izin vermemek. Çizilebilir nesneleri izlemek için daha iyi bir yönteminiz varsa bunları elle çekmek için CommandBuffer.DrawMeshInstanced veya Graphics.DrawMeshInstanced kullanabilirsiniz. Bu konuda çok daha fazla ayrıntıya girmeyeceğim, çünkü bu çok daha ileri düzeyde ve culling'in kendini ve neyi engellemesini gerektiriyor.

Statik veya dinamik gruplamanın düzgün şekilde çalışmadığı durumlarda (çerçeve hata ayıklayıcısını kontrol ederek görebilirsiniz), gerçekten paylaşılan malzeme kullandığınızdan ve arama sırasında kazayla malzemenin kopyalarını almadığınızdan emin olmanız gerekir meshRenderer.material. Bunu çağırmak, .materialmalzemelerinizin kopyalarını alır ve harmanlamayı keser. Yerine .sharedMaterialkullanın.

Unity 5.6'dan bu yana, belirli çekmecelerin neden önceki çekmecelerle toplu olmadığını belirlemek için Kare Hata Ayıklayıcı'yı kullanabilirsiniz. Bu, oyununuzun çekincelerini azaltmaya çalışırken gerçekten yararlı olacaktır.

Örnekleme, statik / dinamik / özel gruplamaya göre aşağıdaki avantajlara sahiptir:

  • Kafesin bellekte çoğaltılması gerekmediğinden daha az bellek kullanır
  • Birden fazla malzeme kullanabilir, sadece paylaşılan gölgelendirici gerekir
  • Nesneler canlandırılabilir

Ayrıca bir olumsuzluk olarak Unity'deki yeni bir özellik ve biraz dengesiz olabilir. Ayrıca eski veya mobil cihaz GPU'larının örneklemeyi desteklemesi gerekmez.


1. Evet, LOD'ları denedim ve şaşırtmam çok oldu, aslında daha da kötüleşti. Her biri biraz daha düşük tepe sayımlı ağaçların 3 varyasyonunu ve üzerinde ağacın oluşturulmuş görüntüsünü içeren bir düz düzlemim vardı.
mr-matt

2. Bütün ağaçlarım statik olarak işaretlendi. Bunu bildiğim kadarıyla harmanlamayı mümkün kılıyor? Bu doğru mu? Ve ortak malzeme derken, ağaçların aynı materyale sahip olduğunu mu demek istiyorsun?
mr-matt

3. Bu gerçekte ne tür bir performans iyileştirmesi gerçekleştirir? Denemeye değer mi?
mr-matt

1
2/3: Deneyimlerime göre Unity, dinamik gruplamada çok iyi bir iş yapmıyor ve statik gruplama yapı boyutunu artırıyor, bu yüzden gruplamayı kendim uyguladım ve örgü-yük süresini birleştirdim. Bu tekniği kullanarak, çekmecelerin önemli olduğu mobil oyunumuz için çok önemli olan yaklaşık 300 çekmeceye sıkıştırmak için 2500 çekmece yapmayı başardım. Gereksiz miktarlarda hesaplamalar yapılmasını sağladı (ekran dışı) ancak buna değdi.
Las

2
tfw ağaçları ile zayıf performans hakkında bir soru okuduğunuzda ve billboard hakkında tek bir kelime kayboldu
Num Lock

13

Tamam, bu yüzden sorun basitçe önceden hesaplanmış gerçek zamanlı GI kullanmamamdı. Bunu bir süre önce kontrol ettim ama hemen bir etkisi olmadı, ben de bıraktım ve unuttum, ve aydınlatma işlem süresi de çok uzundu. Ancak, sadece işlemeyi bitirdi ve benim sözüm, fps'im 3x arttı. Şimdilik bunu bırakacağım ve gelecekte her zaman bilgisayar öncesi gerçek zamanlı GI kullandığımdan emin olun!

Performansı daha da geliştirmek için yapabileceğim başka bir şey varsa, lütfen bana bildirin, en müteşekkir olurum!


2
Sahneniz büyükse bile, Tıkanma Ayırma özelliğini kullanın; örneğin birçok arazide bölmeyi düşünün; örneğin, birçok araziyi bölüp boşaltın.
Candid Moon _Max_

Sorununuzu çözdüğünüze göre, muhtemelen bu cevabı kabul etmelisiniz.
Gnemlock
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.