Unity AudioClip Import Ayarları

Yayınlandı: 31 Mart 2020 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

Tekrardan merhabalar,

Bu derste, Unity‘e import ettiğimiz ses dosyalarının (AudioClip) Inspector’daki ayarlarına bakacak, hangi sesler için hangi ayarlar uygun olur onu tartışacağız.

Dersi yazarken şu iki yabancı kaynaktan çokça faydalandım:

Hazırsanız başlayalım!

Ayarlar

Bir ses dosyasını seçince Inspector’da şu ayarları görürsünüz:

Force To Mono

Bazı sesler tek kanaldan oluşur (mono), bazıları ise birden çok kanaldan oluşur (stereo). Kulaklık ile stereo müzik dinlerseniz, her iki kulaklığa müziğin başka bir kanalı yayın yapar. Bazı müzikler sol kulaklığa şarkının vokallerini iletirken sağ kulaklığa da belli bir enstrümanı iletirler.

Unity stereo ses dosyalarını destekler ancak sadece 2D sesler için bu geçerlidir, 3D seslerde stereo desteklenmez. Sesin 2D mi yoksa 3D mi olacağını, sesi çalan AudioSource component’indeki Spatial Blend değişkeni belirler. 3D seslerde, AudioListener component’i (genelde kamera) AudioSource’tan uzaklaştıkça sesin şiddeti azalır, 2D seslerde ise sesin şiddeti AudioListener’a olan mesafeden bağımsızdır.

Velhasıl kelam, 3D seslerde stereo desteklenmediği için, eğer stereo bir ses klibini 3D uzayda çalacaksanız, Force To Mono‘yu açarak bu ses klibini mono’ya çevirebilirsiniz. Böylece ses dosyası iki kanal yerine tek bir kanaldan oluşur ve boş yere fazladan yer kaplamaz. Stereo olmasını istemediğiniz 2D seslerde de bu özelliği açarak performansı biraz iyileştirebilirsiniz.

Normalize

Force To Mono ile stereo’dan mono’ya çevrilen bir klibin, bu esnada ses şiddetini kaybetmemesine yardımcı olur. Bu seçenek kapalı ise, sesin şiddeti normalden daha düşük olabilir.

Ambisonic

Anladığım kadarıyla genelde VR oyunlarında kullanılan bir özellik; kafanın oryantasyonuna göre sesin kulağa daha gerçekçi gelmesini sağlıyor. Bu özelliğin çalışması için Edit-Project Settings-Audio-Ambisonic Decoder Plugin‘e bir değer vermeniz gerekiyor. Daha fazla bilgi için: https://docs.unity3d.com/Manual/AmbisonicAudio.html

Load In Background ve Preload Audio Data

Unity’nin bu ses klibini nasıl ve ne zaman hafızaya alacağını belirler. Olası tüm kombinasyonlar şunlardır:

LOAD IN BACKGROUNDPRELOAD AUDIO DATASONUÇ
AçıkAçıkSes klibi sahne açılır açılmaz hafızaya alınmaya başlar (preload) ancak bu işlem arkaplandaki bir thread’de gerçekleşir (load in background). Bu sayede, bu işlem sahnenin açılma süresini olumsuz etkilemez ve ses yüklenirken oyun takılmaz.

Eğer sesi çalmak istedeğimiz anda ses hâlâ arkaplanda yüklenmekte ise, sesin yüklenmesi bittikten sonra ses çalmaya başlar. Yani diyelim sesi oyunun 5. saniyesinde çalmak istediyseniz ama sesin hafızaya alınması oyunun 7. saniyesinde bittiyse, ses 7. saniyede çalmaya başlar, yani 2 saniye gecikme olur.
AçıkKapalıÜsttekinden tek farkı, ses sahne açılır açılmaz değil de sesi ilk kez çalmak istediğiniz anda hafızaya alınmaya başlar. Büyük ses dosyaları için bu, sesin oldukça gecikmeli çalınmasına sebep olabilir. Örneğin sesi ilk kez oyunun 5. saniyesinde çalmak istediyseniz, ses 5. saniyede arkaplanda yüklenmeye başlar. Bu işlem eğer 4 saniye sürerse, ses oyunun 9. saniyesinde çalmaya başlar.
KapalıAçıkSes klibi sahne açılır açılmaz hafızaya alınmaya başlar (preload) ancak ses tamamen hafızaya alınana kadar sahne başlamaz, yani sesin yüklenmesi arkaplanda gerçekleşmez. Bunun avantajı, sahne açılır açılmaz ses kullanıma hazır olur ve sesi oyunun kaçıncı saniyesinde çalmak istersek isteyelim, ses tam o anda çalmaya başlar, bir gecikme olmaz.
KapalıKapalıSes sahne açılır açılmaz hafızaya alınmaz, sesi ilk kez çalmak istediğiniz anda hafızaya alınır. Ancak bu işlem arkaplanda gerçekleşmez, bu yüzden sesin yüklenmesi esnasında oyun donar.

Diyelim sesi ilk kez oyunun 5. saniyesinde çalmak istediyseniz ve sesin hafızaya alınması 2 saniye sürüyorsa, oyun 2 saniye boyunca donar. Sesin yüklenmesi bitince de ses çalmaya başlar. Yani Load In Background açıkken ses gecikmeli çalmaya başlarken, Load In Background kapalıyken ise ses gecikmeli çalmaz ama ses yüklenene kadar oyun donar.

Bu bilgiler ışığında, eğer oyununuzda az sayıda ses klibi varsa (mesela hyper casual oyunlar), bu kliplerde Load In Background‘u kapatıp Preload Audio Data‘yı açarak, oyun açılır açılmaz tüm kliplerin çalmaya hazır olmasını sağlayabilirsiniz. Eğer çok sayıda ses klibi kullanıyorsanız, sahnenin açılma süresini kısaltmak için, sahne açılır açılmaz hemen ihtiyacınız olmayan ses kliplerinin Load In Background seçeneğini açabilirsiniz. Örneğin uzunlu kısalı 90 ses klibi ile yapılan şu testte, Load In Background açık iken sahnenin 7.5 saniye daha erken yüklendiğini görebiliriz:

Kaynak: https://gamedevbeginner.com/unity-audio-optimisation-tips/

Preload Audio Data‘sı açık sesler sahne açılır açılmaz hafızaya alınmaya başlayacakları için, eğer bu seslerin sayısı çoksa ve bu sesler nispeten uzunsa, bu oyunun çok RAM harcamasına sebep olabilir. Dilerseniz bu seslerin Preload Audio Data‘sını kapatıp, script vasıtasıyla sesleri oyun esnasında istediğiniz bir anda yükleyebilirsiniz, yani bir sesin yüklenmesini illa AudioSource’un tetiklemesine gerek yok. Ardından sesle işiniz bitince de sesi elle RAM’den çıkarabilirsiniz. Bunun için AudioClip‘in şu fonksiyonlarını kullanabilirsiniz:

  • LoadAudioData(): çağırdığınız anda ses hafızaya alınır/alınmaya başlar
  • UnloadAudioData(): çağırdığınız anda ses hafızadan çıkarılır. Daha sonra sesi bir daha çalmak istediğinizde, sesin tekrar hafızaya yüklenmesi beklenir. Unity kullanılmayan sesleri sahne değişirken otomatik olarak hafızadan çıkarır
  • loadState: sesin hafızaya alınıp alınmadığını kontrol etmeye yarar. Alabileceği değerler şunlardır:
    • Unloaded: ses hafızada değildir ve şu anda hafızaya alınmamaktadır
    • Loading: ses hafızada değildir ama şu anda arkaplanda hafızaya alınmaktadır
    • Loaded: ses hafızadadır
    • Failed: sesi hafızaya alırken bir hata oluşmuştur, bu yüzden ses hafızada değildir. Hatayı görmek için oyunun log’larını incelemeniz gerekebilir

Load Type

Sesin hafızada ne şekilde tutulacağını belirler:

  • Decompress On Load: ses hafızada PCM formatında tutulur. Bu format sıkıştırma (compression) içermez, bu yüzden RAM’de çok fazla yer kaplar ama sesi çalarken en az CPU bu modda harcanır. Çok kısa ve sürekli çalan ses klipleri için idealdir
  • Compressed In Memory: ses hafızada sıkıştırılmış formatta tutulur (bu formatı ses klibinin Compression Format‘ı belirler). Bu şekilde ses RAM’de daha az yer kaplar ama sesi çalarken CPU’nun bir yandan sesi decompress etmesi gerektiği için, daha çok CPU harcanır
  • Streaming: ses direkt dosyadan okunur, hiç RAM’e girmez. Sesi diskten okumak I/O işlemi olduğu için bu işlem biraz CPU harcar ve disk hızına göre performansı değişebilir, bu yüzden aynı anda birden çok Streaming sesi çalmaya çalışırsanız, bu performansı ciddi anlamda olumsuz etkileyebilir (özellikle mobil cihazlarda). Eğer oyununuzda aynı anda tek bir arkaplan müziği çalıyorsa, bu müziği RAM’e almak yerine Streaming ile direkt diskten okumak mantıklı bir tercihtir. Aşağıdaki resimde, aynı anda birden çok Streaming ses klibi oynatmanın farklı mobil cihazlarda CPU’yu ne kadar zorladığını görebilirsiniz (en az CPU harcayan mor çizgi, bilgisayarı temsil etmektedir):
Kaynak: https://www.gamasutra.com/blogs/ZanderHulme/20190107/333794/Unity_Audio_Import_Optimisation__getting_more_BAM_for_your_RAM

Tek bir AudioClip’in, farklı Load Type‘larda RAM (hafıza, memory) ve CPU’ya olan etkisini aşağıdaki grafikte görebilirsiniz (kullanılan RAM miktarı tabii ki sesin boyuna göre değişecektir, siz sadece bunların birbirleriyle oranlarına bakın):

Kaynak: https://gamedevbeginner.com/unity-audio-optimisation-tips/

Compression Format

Ses klibinin diskte hangi formatta tutulacağını belirler. Eğer Load Type olarak Compressed In Memory seçili ise, Compression Format aynı zamanda sesin hafızada hangi formatta tutulacağını da belirler. Alabileceği değerler şunlardır:

  • PCM: sıkıştırılmamış ses dosyasıdır. Ses en çok yeri bu formatta kaplar ancak sesi çalmak da o kadar az CPU harcar. PCM seslerde Compressed In Memory ile Decompress On Load aynı görevi görür çünkü ses klibi zaten sıkıştırılmamış formatta olduğu için, hafızaya sıkıştırılmış (compressed) formatta alınamaz. Streaming modda çalınan seslerin CPU kullanımını azaltmak için ise PCM biçilmiş kaftandır, bu şekilde ses diskte daha fazla yer kaplar ama daha az CPU harcar
  • ADPCM: sesi yaklaşık olarak %30 oranında sıkıştırır ve sesi çalarken Vorbis formatına kıyasla daha az CPU harcar. Bu sıkıştırma yönteminde bazen seste ciddi bozulmalar meydana gelebilir, o yüzden Inspector’un altındaki önizleme kısmı ile bu sesleri mutlaka test edin
  • Vorbis: bu sıkıştırma yönteminde sesin kalitesini Quality vasıtasıyla istediğiniz gibi değiştirerek, ses kalitesinden ödün verip sesin boyutunu azaltabilirsiniz. Quality değeri 70 ile 100 arasındayken, bunun sesin kalitesine olan etkisi neredeyse belli bile olmaz. Eğer Vorbis ve ADPCM arasında ciddi bir boyut farkı yoksa, ADPCM sesin kalitesini önemli miktarda bozmuyorsa ve Compressed In Memory modunu kullanıyorsanız, daha az CPU kullanımı için ADPCM’i tercih edebilirsiniz. Decompress On Load sesler için ise, disk alanından tasarruf etmek için Vorbis kullanabilirsiniz
  • MP3: Android ve iOS platformlarında, Override for Android seçeneğini veya Override for iOS seçeneğini açınca karşımıza çıkar. Bu formatta da ses kalitesi Quality ile değiştirilebilir. Kendini tekrar eden (loop) seslerde MP3 iyi çalışmayabilir. İlaveten, MP3 formatı Vorbis’e kıyasla biraz daha fazla CPU harcar. Ancak iOS cihazlar donanımsal olarak MP3 desteklediği için, bu cihazlarda MP3 Vorbis’e göre daha performanslı çalışır. Aynı anda birden çok MP3 ses klibi çalarken, bunlardan sadece biri donanımsal MP3 tarafından işlenebilir, yani diğerleri mecburen Unity tarafından işlenir (dediğim gibi, bu da Vorbis’e göre biraz daha fazla CPU harcar)

Compressed In Memory modundayken, bu formatların bilgisayarda yaklaşık ne kadar CPU harcadığını aşağıdaki tablodan görebilirsiniz (kaynak):

COMPRESSION FORMAT1 AUDIOCLIP6 AUDIOCLIP
PCM%0.05%0.3
ADPCM%0.2%1.0
Vorbis%0.5%3.2

NOT1: eğer sesi yavaş çekimde oynatacaksanız (AudioSource‘un Pitch değerini değiştirerek), PCM harici formatlarda ses kötü çıkabilir. O yüzden bunu mutlaka test edin.

NOT2: sesin daha az yer kaplaması için, .wav gibi sıkıştırılmamış ses dosyaları yerine .mp3 gibi sıkıştırılmış ses dosyaları kullanmak işe yarar mı diye sorabilirsiniz. Bu sorunun cevabı, kullandığınız Compression Format‘a göre değişiyor:

  • PCM ve ADPCM: import ettiğiniz ses dosyası .wav da olsa .mp3 de olsa, oluşturulan AudioClip’in boyutu hemen hemen aynı oluyor (aralarında maksimum birkaç KB fark gördüm). Bu yüzden bu formatlarda .wav‘ı tercih edin, böylece sesin kalitesi .mp3‘e göre daha iyi olur
  • Vorbis: bu formatta AudioClip’in boyutu, .wav veya .mp3‘ün boyutu ile doğru orantılı olarak değişiyor. Eğer AudioClip’in boyutuna önem veriyorsanız .mp3, sesin kalitesine önem veriyorsanız .wav kullanın. Quality ile oynayarak AudioClip’in boyutunu biraz daha düşürebildiğimizi de unutmamak lazım, bu yüzden .wav kullanıp Quality’i düşürmek, .mp3‘e göre daha avantajlı olabilir
  • MP3: .wav da import etseniz .mp3 de import etseniz, AudioClip’in boyutu hemen hemen aynı oluyor. Unity .wav‘ı MP3’e çevirirken sesin kalitesi illa ki bir miktar bozuluyor ancak .mp3‘te herhangi bir çevirme işlemi yapılmadığı için, .mp3 ses dosyası ile MP3 AudioClip’in kaliteleri aynı olur. Bu yüzden .mp3 kullanarak, sesin Unity’de de kulağa birebir aynı geldiğinden emin olabilirsiniz

Sample Rate Setting

Sesin sample rate‘i ile alakalı bir ayardır:

  • Preserve Sample Rate: sesin sample rate’ine dokunulmaz
  • Optimize Sample Rate: sadece PCM ve ADPCM formatlarında işe yarar. Unity, Nyquist teorisinden faydalanan bir algoritma kullanarak, sample rate’i en optimize bulduğu değere çeker
  • Override Sample Rate: sample rate’i elle belirlemeye yarar

Referans Tablolar

Aşağıdaki tablolar, PC ve mobil platformlarda farklı ses türleri için hangi import ayarlarının önerildiği yazmakta. Bunlara uyup uymamak tabii ki size kalmış. Bu tabloları direkt şu adresten aldım: https://www.gamasutra.com/blogs/ZanderHulme/20190107/333794/Unity_Audio_Import_Optimisation__getting_more_BAM_for_your_RAM

PC İçin Önerilen Ayarlar

Burada seslerin çoğu Decompress On Load modunda ancak oyununuz RAM sıkıntısı yaşıyorsa, uzun ses kliplerini Compressed In Memory moduna alabilirsiniz.

Mobil İçin Önerilen Ayarlar

Bu dersin de sonuna gelmiş bulunmaktayız. Sonraki derslerde görüşmek üzere!

yorum
  1. Kerim dedi ki:

    Ağabey merhabalar, ben bu konu ile ilgili olmayan, başka bir soru sormak istiyorum. Mobil oyun yapıyorum lakin oyun için şöyle bir sisteme ihtiyacım var : Adını tam bilmiyorum lakin telefnun ekranını hareket ettirdikçe bir topu hareket ettirmek istiyorum. Bunu nasıl yapabileceğimi biliyorsan yardım eder misin? Ya da bilmiyorsan bu sistemin adı nedir? Adını söyleyebilirsen belki internette başka kaynaklardan da bulabilirim. Şimdiden çok teşekkür ederim…

  2. efecan dedi ki:

    Yasir hocam peki ses dosyalarının mb’ları mesala mp3te daha düşük oluyor ama wav uzantısına cevırdığımde mb’tı yükseliyor bu ses dosyalarını projeye import yaptığımızda .apk aldığımız zaman apk mb tımızı yükseltmez mi?

    • yasirkula dedi ki:

      Şimdi yaptığım bir testte, Compression Format PCM, ADPCM veya MP3 iken 0.6MB’lık .wav ile 75KB’lık .mp3’ün sıkıştırılmış boyutları neredeyse birebir aynıydı (maksimum 1-2 KB fark gördüm). Ama Vorbis’te MP3’ün sıkıştırılmış formatı 130KB daha ufaktı. Yani Vorbis harici formatlarda, .mp3 gibi sıkıştırılmış bir sesin .wav’a göre bir avantajı yok. Vorbis’te ise .mp3 daha az yer kapladığı için, burada ses kalitesi mi yoksa ses boyutu mu önemli ona göre tercih yapılabilir. Yazıyı şimdi bu bilgiler ışığında güncelledim 🙂

  3. DilaverSerif dedi ki:

    Teşekkürler sizde olmasanız nereden türkçe kaynak bulacağız 🙂

Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.