Yeniden merhabalar,
Asset Store’dan projenize import ettiğiniz veya ekibinizdeki grafikerlerden aldığınız Texture’ların bazen tek bir tanesinin bile onlarca MB (ender durumlarda yüzlerce MB) yer kapladığına şahit olabilirsiniz. Bu durum genelde resmin sıkıştırılmamış TIFF veya TGA gibi bir formatta olmasından kaynaklanır. Bu resimleri PNG‘e çevirerek, kalitede hiçbir bozulma olmadan bu dosyaların boyutlarını ciddi miktarlarda düşürebilirsiniz. Örneğin ben Asset Store’dan import ettiğim bir 3D asset’in bu tarz Texture’larını PNG’e çevirerek, projenin boyutunu 1.08 GB’dan 510 MB’a kadar düşürdüm. Yanlış anlaşılma olmasın: Texture’ların sadece Unity projesinde kapladığı alan düşüyor, build alınan oyunun boyutu değişmiyor. Ama bu bile, projenin harddiskinizde daha az yer kaplaması veya projenin daha kolay yedeklenebilmesi gibi konularda yardımcı oluyor.
Bu iş için yazdığım editör script’ini görmek için yazının devamını okuyabilirsiniz…

Yapmanız gereken, projenizin Editor klasöründe (bu klasör yoksa oluşturun) ConvertTexturesToPNG adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/407e15017a01324a9ea95bf1bdea72f7
Ardından Window-Convert Textures to PNG ile Convert to PNG penceresini açabilirsiniz. Buradaki ayarlar şunlar:
- Root Path: bu klasör içindeki resimler PNG’e çevrilir. Alt klasörlerdeki resimler de çevrilirler
- Textures to Convert: sadece bu uzantılara sahip resimler PNG’e çevrilirler
- Excluded Directories: bu klasör(ler)deki resimlere dokunulmaz. İki klasörün konumunu
;(noktalı virgül) ile birbirinden ayırabilirsiniz (Textures to Convert‘te olduğu gibi) - Keep Original Files: eğer işaretlenirse, PNG’e çevrilen resimlerin asıllarına dokunulmaz; işaretlenmezse resimlerin asılları otomatik olarak silinirler
- Max Texture Size: bu ebattan büyük resimlerin boyutu bu ebata düşürülür
- OptiPNG Path: hazır bir PNG sıkıştırma kütüphanesi olan OptiPNG ile, PNG’e çevrilen resimlerin boyutunu yaklaşık %20 daha küçültmeye yarar. Bunun için önce optipng.exe dosyasını indirmeli (şuradaki Windows build), ardından bu dosyanın konumunu bu kutucuğa girmelisiniz. İsterseniz bu alanı boş bırakabilirsiniz
- OptiPNG Optimization: sadece OptiPNG Path‘in değeri girilmişse gözükür. Bu değer arttıkça, OptiPNG’nin resim boyutlarını düşürme olasılığı artar ama aynı zamanda resimlerin PNG’e çevrilmesi çok daha uzun sürer
Ayarları doldurduktan sonra, Convert to PNG! butonuna tıklayarak süreci başlatabilirsiniz. Eğer “Keep Original Files” seçeneği kapalıysa veya projenizin Editor Settings‘indeki “Asset Serialization Mode” ayarı “Force Text” ise, PNG’e çevrilen resimlerin kullanıldığı yerler otomatik olarak güncellenir (yani mesela bir materyal Resim.tiff’i Texture olarak kullanıyorduysa, materyal artık otomatik olarak Resim.png’i Texture olarak kullanır). Aksi taktirde tüm bu referansları siz elle güncellemelisiniz.
BONUS: Projedeki Tek Renkten Oluşan Texture’ları Bulmak
3D model asset’lerinde kullanılan Specular, Metallic veya Emission gibi Texture’lardan bazıları sadece tek bir renkten oluşabilir. Eğer materyalde aynı etkiyi Smoothness gibi bir float değeri değiştirerek de elde edebiliyorsak, bu tamamen boşuna bir performans kaybıdır çünkü ekran kartı o materyale sahip objeleri ekrana çizerken basit bir float’ın değerini okumak yerine, boş yere komple bir Texture’un değerini okumak zorunda kalır. Ama bazen materyaldeki float değerlerle oynasak bile, tek renkli Texture’un verdiği etkiyi elde edemeyebiliriz. Bu durumda ise yakınabileceğimiz başka bir nokta var: 3D modelciler genelde bu tek renkli Texture’ların boyutunu 32×32 gibi ufak boyutlara ayarlamazlar, 1024×1024 gibi kocaman boyutlara ayarlarlar. Texture zaten tek bir renkten oluştuğu için, 32×32 de olsa 1024×1024 de olsa birebir aynı etkiyi gösterecek olmasına rağmen o Texture’u yapan 3D artistin ihmalinden dolayı Texture boş yere 0.5 MB fazla yer kaplar ve bu fazlalık hem RAM’e hem de build alınan oyunun boyutuna etki eder (build alınan oyun sıkıştırıldığı için ona 0.5 MB’tan daha az etki eder tabi)!
Üstte bahsettiğim durumları tespit etmeye yardımcı olması için basit bir editör script’i yazdım:

Yapmanız gereken, projenizin Editor klasöründe (bu klasör yoksa oluşturun) SingleColorTextureDetector adında yeni bir C# script oluşturmak ve script’in içeriğini şuradaki kodla değiştirmek: https://gist.github.com/yasirkula/19905788e68d4c2bbb8e229b5670480a
Ardından Window-Single Color Texture Detector ile Solid Textures penceresini açıp Refresh butonuna tıklayabilirsiniz. İşlem tamamlanınca, projenizdeki tek renkten oluşan tüm Texture’lar listelenecek. Listelenen konumlardan birine çift tıklarsanız, o konumdaki Texture otomatik olarak seçilir.
Listedeki bir Texture’un nerelerde kullanıldığını bulmak için, şu dersimde paylaştığım Asset Usage Detector plugin’ini kullanabilirsiniz. Eğer ilgili Texture’un ebatları 32×32’den büyükse ve Texture’un büyük olmasını gerektirecek çok ama çok özel bir durum yoksa, ilk iş o Texture’un Max Size‘ını 32’e düşürün. Böylece o Texture’un hem RAM hem de build boyutunu optimize etmiş olacaksınız. Ardından Texture’un kullanıldığı materyallerde gerçekten gerekli olup olmadığına bakın. Eğer Texture’u materyalden kaldırınca hiçbir şey değişmiyorsa ne iyi ne âlâ, yaptığınız değişikliği kaydedin. Eğer Texture kalkınca materyalin görünümü değişiyorsa, materyaldeki float değerleri değiştirerek aynı etkiyi alabiliyor musunuz kontrol edin. Alabiliyorsanız o şekilde yaptığınız değişiklikleri kaydedin, aksi taktirde Texture’u materyale geri verin.
Bu dersi de noktaladık. Sonraki derslerde görüşmek üzere!