Unity için Optimizasyon İpuçları

Unity yalnızca bağımsız geliştiriciler arasında değil, büyük şirketler arasında da popüler olan bir oyun motorudur.

Kullanıcı dostu bir arayüze, güçlü bir Rendering hattına, kullanımı kolay bir bileşen sistemine sahiptir ve son olarak çok çeşitli platformları destekler.

Ancak kullanımı kolay bir arayüz sayesinde oyununuzu aşırı karmaşık hale getirmek daha da kolaydır (örneğin bir sürü gereksiz nesneyi yerleştirerek, vb.), bu nedenle optimizasyona sahip olmak önemlidir tüm gelişim süreci boyunca aklınızda bulundurun.

İşte oyununuzun performansını artırmanıza yardımcı olacak 3 ana kategori (Oluşturma, Komut Dosyası Oluşturma, ve Ses) için önemli ipuçları:

İşleme

1. İpucu: Oluşturucu bileşeni içeren Nesneleri ölçeklenmemiş halde tutun

Ölçeklenmemiş nesneler (1, 1, 1) ölçeğine sahip nesnelerdir. Bu durumda Unity'in nesneyi her karede yeniden ölçeklendirmek için ek hesaplamalar yapmasına gerek yoktur.

Örnek: Diyelim ki seviyenize göre çok büyük veya çok küçük bir ev modeliniz var. Yapılacak doğal şey bunu şu şekilde ölçeklendirmektir:

Binanın yeniden boyutlandırılması

Çoğu zaman nesneyi Sahne görünümünde ölçeklendirmek uygundur, ancak bu nesnenin çok sayıda kopya örneğine sahip olmayı planlıyorsanız ölçeği İçe Aktarma Ayarlarında değiştirmeniz tercih edilir.

Yapmanız gereken ilk şey, modeli ihtiyaçlarınıza uyacak şekilde ölçeklendirmek (örn. yukarıdaki bina (1, 1, 1)'den (0,49482, 0,49482, 0,49482)'ye ölçeklendirilmiştir), ardından Projede modeli seçmektir. görünümünü açın ve İçe Aktarma Ayarlarında Ölçek Faktörünü not edin (Genellikle 1 veya 0,1'dir).

Varsayılan ölçek faktörünün yeni ölçekle çarpımına eşit olması gereken yeni değeri ayarlayın (benim durumumda bu 1 x 0,49482 = 0,49482), ardından Uygula'ya basın. Şimdi sahne görünümündeki modele geri dönün ve ölçeği tekrar (1, 1, 1) olarak ayarlayın.

Unity 3D Ölçek faktörü ayarları

Nesne artık varsayılan (1, 1, 1) ölçeğini koruyarak ihtiyacınız olan şekilde ölçeklendirilir.

Bu ipucu, SkinnedMeshRenderer'ı kullanan animasyonlu nesneler için özellikle önemlidir; çünkü bu bileşenin işlenmesi daha pahalıdır ve (1, 1, 1) ölçeğine sahip olmak, oluşturma sürecini basitleştirir.

İpucu 2: Mümkün olduğunca az ışık kullanın

Unity'de 3 tür ışık vardır (Yönlü ışık, Nokta ışığı ve Spot ışığı). Performans açısından Yönlü ışık, render için en ucuz olanıdır, ardından Point ve son olarak Spotlight'tır.

Genel olarak, sahne başına 1'den fazla yönlü ışığa sahip olmak istemezsiniz ve spot ve nokta ışıklar için mümkün olduğunca az (ya da hiç) ışık bulundurmamaya çalışın.

Gerçek zamanlı gölgeler açısından, oyunun görsel yönünü geliştirirken yüksek performans yüküne sahiptir, bu nedenle genel olarak onları devre dışı bırakmak veya lightmaps ve light'a dönüştürmek daha iyidir problar.

3. İpucu: Şeffaf Gölgelendiricileri dikkatli kullanın

Şeffaf veya Parçacık Gölgelendiricileri yalnızca şeffaf olması gereken yüzeylerde (örn. Çitler, Duman Parçacıkları vb.) kullanın.

Şeffaflığa sahip nesneler, özellikle Mobil veya Web gibi sınırlı kaynaklara sahip platformlarda performansı düşürebilecek ek bir oluşturma geçişi gerektirir.

Komut dosyası oluşturma

1. İpucu: Bileşen referanslarını her zaman önbelleğe alın

Her Güncellemede onlara erişmeyi planlıyorsanız bileşen referanslarını her zaman önbelleğe almalısınız.

Örneğin aşağıdaki betiği kontrol edin:

Kötü

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

    // Update is called once per frame
    void Update()
    {
        someValue = GetComponent<Script2>().someValue2;
    }
}

Burada Script2'den "someValue2" değişkenini alan ve onu yerel bir değişkene atayan Script1'imiz var.

Artık her kare için yalnızca bir GetComponent çağırmanın performans üzerinde herhangi bir etkisi olmayacaktır, ancak sık kullanılacak bileşenleri önbelleğe alma alışkanlığını edinmelisiniz.

Bir bileşeni bir komut dosyasında önbelleğe almanın iki yolu vardır; ya genel bir değişken oluşturup bunu Denetçi görünümünde atayın ya da özel bir değişken oluşturup bunu Başlat veya Uyanık'tan atayın. Aşağıdaki örneği kontrol edin:

İyi

using UnityEngine;

public class Script1 : MonoBehaviour
{

    float someValue = 0;

    Script2 script2Cached;

    // Use this for initialization
    void Start()
    {
        script2Cached = GetComponent<Script2>();
    }

    // Update is called once per frame
    void Update()
    {
        someValue = script2Cached.someValue2;
    }
}

Çok daha iyisi, Script2'ye artık her Güncellemede performans yükü olmadan erişilebiliyor.

BoxCollider, Rigidbody vb. gibi yerleşik bileşenler için de aynısını yapın (Transform ve GameObject hariç bunlar varsayılan olarak önbelleğe alınmıştır, böylece onlara hemen erişebilirsiniz).

2. İpucu: SendMessage'ı dikkatli kullanın

SendMessage, bir oyun nesnesine ekli olan her MonoBehaviour'da belirli bir işlevi (varsa) çağırmanıza olanak tanır.

Örneğin oyunda bir silahla ateş ettiğinizde, GetComponent ve diğer ekstra şeyleri kullanmanıza gerek kalmadan, mermi düşmana çarptığında hızlı bir şekilde hasar verebilirsiniz.

Ancak bu yöntem oldukça yoğun bilgi işlem gerektirdiğinden çok sık çağrılmamalıdır.

3. İpucu: GameObject.Find ve GameObject.FindWithTag'i dikkatli kullanın

GameObject.Find, GameObject.FindWithTag ve GameObject.FindGameObjectsWithTag, Sahnedeki nesneleri hızla aramanızı sağlar. Bu yöntemler GetComponent'ten çok daha yavaştır ve yalnızca başlatma sırasında kullanılmalıdır.

4. İpucu: OnGUI kullanmaktan kaçının

Geçmişte OnGUI, Unity'de menüler oluşturmanın tek yoluydu. Ancak o zamandan beri UI Canvas adında performans açısından çok daha iyi ve çok daha fazla işlevsellik sunan bir alternatif eklendi.

Bununla birlikte, OnGUI hala Unity'de kullanıcı arayüzü oluşturmanın geçerli bir yolu olmaya devam etmektedir ve kesinlikle kullanmanız gerekiyorsa, OnGUI'nin kare başına en az iki kez (Güncelleme ve LateUpdate'in iki katı) çağrıldığını unutmayın. kullanıcı arayüzünün yanı sıra herhangi bir hesaplama için kullanın.

Yapabileceğiniz şeylerden biri, içinde yalnızca OnGUI bulunan ayrı bir komut dosyasına sahip olmak ve gerektiğinde onu etkinleştirmek/devre dışı bırakmaktır.

Örneğin:

UIScript.cs

using UnityEngine;

public class UIScript : MonoBehaviour {

    void OnGUI()
    {
        if(GUI.Button(new Rect(5, 5, 125, 25), "Button 1"))
        {
            //Button 1 was pressed, Do Something
        }
        if (GUI.Button(new Rect(140, 5, 125, 25), "Button 2"))
        {
            //Button 2 was pressed, Do Something
        }
    }
}

Script1.cs

using UnityEngine;

public class Script1 : MonoBehaviour
{

    UIScript uiScript;

    // Use this for initialization
    void Start()
    {
        uiScript = GetComponent<UIScript>();
        uiScript.enabled = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            //toggle UIScript when Tab is pressed
            uiScript.enabled = !uiScript.enabled;
        }
    }
}

Hem UIScript hem de Script1 aynı GameObject'e eklenmiştir. Script1 menünün ne zaman gösterileceğini kontrol eder.

Oynatıcı Tab tuşuna bastığında düğmeleri gösteren UIScript etkinleştirilir. Tab'a tekrar basıldığında düğmeler gizlenerek onu devre dışı bırakır.

UIScript devre dışı bırakıldığında OnGUI yöntemi çağrılmaz ve bu da performansı artırır.

İpucu 5: Profiler'ı kullanın

Profiler, darboğazları ve fps düşüşlerini belirleme konusunda en önemli araçlardan biridir ve düşük performansın kesin nedenini bulmayı kolaylaştırır.

Ses

Ses Klipleri, İçe Aktarma Ayarlarının doğru olduğundan emin olunarak optimize edilebilir.

Optimum Ses İçe Aktarma Ayarları ses uzunluğuna, oynatma frekansına ve hedef platforma bağlı olacaktır.

Önerilen Makaleler
Birlik için Billboard Jeneratörü
En İyi Performans için Unity Ses Klibi İçe Aktarma Ayarları
Unity'de Güncelleme Nasıl Kullanılır?
Unity, Profiler'ı Kullanarak Oyununuzu Optimize Edin
Unity'de Mobil Oyunun Performansını Artırma
Birlik için Twitter İpuçları
Oyun Tasarımının Temel Kavramları