Hangi GetComponent metodunun daha performanslı sonuç verdiğini hiç düşündün mü? Ben düşündüm (nedenini sorma lütfen, merak der geçerim)
Genelin de geneli GetComponent tanımı:
Unity ile geliştirilen projelerde karşılaşmamız neredeyse kaçınılmaz olan bu metot verilen bileşen tipini objede arar, eğer obje bu bileşene sahipse bileşeni, sahip değilse null değeri döndürür.
Detaylı teknik dokümentasyon için: GetCompenent Documentation
Oyun geliştirme serüvenimin başlarındayken bir büyüğüm tarafından uyarılana kadar bu metodun ne kadar masraflı işlere yol açacağının farkında olmadan yazar geçerdim.
Sorun şuydu ki tekrara dayalı olmadığında masum sayılabilecek olan bu metodun tekrarlanması halinde masrafı katladığı, zaman karmaşıklığının içinden geçtiğini ufak testler yaparak kendim de görebilecekken; enerjimi yeni şeyler öğrenmeye adamış, öğrenmiş olduklarımın performansını göz ardı ederek uyguluyordum.
Bu yazımdan sonra, umarım en azından bu konuda, biraz da olsa bilinç uyandırabilirim.
Şimdi gelelim bu yazımızın konusuna.
Bildiğiniz üzere 3 farklı GetComponent metodu bulunuyor, fakat hangisi daha performanslı bir işlem sunuyor? Metotlarımız:
- GetComponent<T>();
- (Type) GetComponent(string)
- GetComponent(typeof(T))
şeklinde.
Neden mi farklı türlerde metotlarımız mevcut? Eğer bu sorunun cevabı sende yoksa üzgünüm. Bugünkü cevaplarıma bu dahil olmayacak, Araştırarak sorunu çözeceğine eminim, basit birkaç cevabı var.
Bu 3 metottan sadece bir tanesi çoğu senaryoda en performanslı sonucu gösteriyor. Hangisi mi? Okumaya devam et, eğer en azından bir süredir Unity & C# ile geliştirmeler yapıyorsan şaşıracaksın :)
Öncelikle performans farklılıklarını anlayabilmek için örnek bir proje oluşturup bu proje içerisinde birkaç satır kod yazıp bu kod satırlarını Unity/Profiler Tool’u kullanarak test edeceğiz.
Bir adet “Test” isimli GameObject oluşturup içerisine PerformanceTest.cs isimli scriptimizi component olarak ekleyelim.
Scriptimizin içerisine aşağıdaki değişkenleri ekleyelim. Birisi iterasyon sayısını tutacak. Diğeri ise atama işleminde bize yardımcı olacak.
const int iterations = 10000;Transform test;
Metot olarak ise şu üç metodu ekleyelim:
//GetComponent<T>(); void Test1() { for (var i = 0; i < iterations; i++) { test = GetComponent<Transform>(); } }
//(Type)GetComponent(string) void Test2() { for (var i = 0; i < iterations; i++) { test = (Transform)GetComponent("Transform"); } }
//GetComponent(typeof(T)) void Test3() { for (var i = 0; i < iterations; i++) { test = (Transform)GetComponent(typeof(Transform)); } }
Şimdi de Update metodunda istediğimiz zaman çağırabileceğimiz şekilde ayarlama yapalım:
void Update() { if (Input.GetKeyDown(KeyCode.Space)) { Test1(); Test2(); Test3(); }
}
ve beklenen an:
Görüp görebileceğiniz en yanlış kullanımıyla yaptığımız performans testimizin sonucunda:
- (2.73ms) Test2() = (Type)GetComponent(string);
- (4.17ms) Test1() = GetComponent<T>();
- (6.30ms) Test3() = GetComponent(typeof(T));
şeklinde bir sıralama yapmamız mümkün olacaktır.
Hiç yorum yok:
Yorum Gönder
Görüş ve Düşüncelerinizi Bizimle Paylaşmayı Unutmayın.