Çizim performansını artırmak için yapabileceğiniz birkaç şey var.
Ç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.
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.
Ö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.
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 .
Ç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.
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.
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, .material
malzemelerinizin kopyalarını alır ve harmanlamayı keser. Yerine .sharedMaterial
kullanı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.