Unity Çerez Ders: Büyük Texture’ları (TIFF, PSD, TGA, BMP) PNG Formatına Çevirerek Proje Boyutunu Düşürmek

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

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!

yorum
  1. efsane dedi ki:

    https://www.hizliresim.com/5cna40

    admin bu sorunu çözemedim internette jobs menüsünden yapıyorlar ama o menü yok nasıl ekliyeceğimi de bulamadım

    https://forum.unity.com/threads/a-native-collection-has-not-been-disposed-enable-full-stacktraces-how.1043248/

    bu linkte jobs menüsü var bende yok nasıl ekleyebilirim bu sorunu basıl çözebilirim

    • yasirkula dedi ki:

      Kullandığınız bir plugin’den kaynaklı olabilir diye düşünüyorum. Jobs menüsü için Package Manager’dan Burst kurmanız lazım ama belki buna gerek kalmadan sorunun kaynağını tespit edebilirsiniz. Eğer bu sorunun ne zaman çıktığını biliyorsanız (mesela diyelim her sahne geçişinde kesin çıkıyorsa), oyunda kullandığınız plugin’leri geçici olarak tek tek silip hangi plugin’i silince sorunun çözüldüğüne bakabilirsiniz. Veya sorun editörde belli bir eylem yapınca ortaya çıkıyorsa, google’da o eylemi, bu hata mesajı ile birlikte İngilizce olarak aratabilirsiniz.

  2. disking dedi ki:

    Hocam merhabalar admob ile ilgili şöyle bir sorunum var. Oyunda bildiğiniz gibi Start a reklam isteği atmak için kodları yazıyoruz. Ben oyunumda kullanıcı yandığı zaman yani oyunu baştan başlatacağım zaman sahneyi baştan yüklüyorum bu da start kısmına yazdığımız kodu tekrar çalıştırıyor ve tekrar reklam isteği atıyor, yani kullanıcı 10 kere yeniden başlayıp 1 kere reklamı görüntüledi ise boşu boşuna 9 tane daha reklam isteği gitmiş oluyor ve istekler boş kalıyor bu da Google açısından sorun yaratıyor. Bunu çözmek için Dontdestroyonload komutunu kullandım bu reklam objesini sahne değişimlerinden koruyor fakat bu sefer de sahneyi tekrar yüklediği zaman sanırım önbellekten önceden yüklediği reklamı siliyor bu yüzden de göstermek istediğimde göstermiyor tekrar reklamı isteği atmam gerekiyor bu sefer de yine en baştaki soruna çıkıyor bunu nasıl çözebilirim?

    • yasirkula dedi ki:

      DontDestroyOnLoad yapacaksanız, Start fonksiyonunda reklam script’inin instance’ı zaten var mı diye bakıp varsa Destroy ile mevcut objeyi yok etmeniz lazım. Yoksa her sahne yeniden başladığında sahnedeki reklam script’i sayısı da 1 artar. Singleton reklam script’imde bu sıkıntı olmamalı.

      • disking dedi ki:

        dediğiniz şeyi anladım öncelikle objeyi bu obje mi diye kontrol edip sonradan oluşan objeleri yok ediyoruz kısaca Singleton kullanıyoruz onda sorun yok fakat dediğim gibi sahne yeniden yüklendiği zaman yüklenen reklamlar önbellekten muhtemelen siliniyor çünkü reklamlar açılmıyor bunu çözemedim tekrar tekrar istek atıp reklamı yüklersem sorun yok fakat dediğim gibi bu sağlıklı bir yol değil.

      • yasirkula dedi ki:

        Reklamlar sahneye bağlı değil. Siz reklamları bir yerde Destroy etmiyorsanız ve halihazırda reklam varken yeni reklam isteği ile mevcut reklamın üzerine yazmıyorsanız bu sorun olmaz. Dediğim gibi, singleton reklam script’imi inceleyebilirsiniz. Onda bu sorunun olduğunu sanmıyorum.

  3. efsane dedi ki:

    https://hizliresim.com/nfg24Z admin bu hatayı alıyorum bazı kullanıcılarımdan bende böyle bir hata yok ama nasıl çözebilirim minifity den r8 debug release yi açtım ondan olabilir mi

    • yasirkula dedi ki:

      Bana sormadan önce google araması yapmanı öneririm. ‘your hardware does not support this application failed to load libmain.so unity’ şeklinde arama yapınca karşıma gelen şu linke göre, Unity’nin son sürümlerinde bu sorun düzeltilmiş.

  4. aslan dedi ki:

    https://developer.android.com/studio/build/shrink-code#native-crash-support bunu nereye koysam kabul etmedi hangi gradle.builde koyucağımı anlamadım gradle.properties e koydum olmadı yardım eder misin

    • yasirkula dedi ki:

      Ben build’leri hep Unity’de alıyorum, Android Studio’da almıyorum. O yüzden Android Studio’da build adımları nasıl oluyor veya Gradle ayarları nereden nasıl yapılıyor bilmiyorum.

  5. mert dedi ki:

    sa admin bir konuda yardımın gerek oyunumda internetin açık olup olmadığını kontrol ettirmek istiyorum diyelim butona basınca internet veya mobil veri açıksa reklam girsin değilse direk geçsin

  6. efsane dedi ki:

    Sevgili Geliştiriciler, Aslan Oyun Studiosu’nda, Yakın zamanda yapılan bir incelemeden sonra, uygulamanız olan …(…) Uygulamanızın durumu ve sorunun nasıl düzeltileceği hakkında daha fazla bilgi için aşağıya bakın.
    Yayın Durumu
    Yayın durumu: Reddedildi
    Uygulamanız Google Play’e kabul edilmedi. Bu, mevcut uygulamanızın Google Play’deki durumunu etkilemez
    İhlal nedenleri
    Sürümlere göre uygunluk sorunları
    Sürüm (ler) Uygunluk Sorunu
    App Bundle: 1 APK GEÇERLİ GİZLİLİK POLİTİKASI GEREKTİRİR
    Uygulamanız, kullanıcıların Telefon Numarası bilgilerini, hem Play Developer Console’da belirtilen alanda hem de Play dağıtılmış uygulamasının içinden bir gizlilik politikası yayınlamadan Alipay SDK aracılığıyla yüklüyor.
    Uygulama Paketi: 1
    APK ÖNEMLİ AÇIKLAMA GEREKTİRİR
    Uygulamanızın, önemli ifşa yönergelerini karşılamadan Telefon Numarası bilgilerinin toplanmasını kolaylaştıran Alipay SDK veya kitaplığı kullandığını belirledik. Gerekirse, daha fazla bilgi için SDK sağlayıcılarınıza danışabilir veya lütfen SDK sürümünü 15.5.5 veya üstüne yükseltebilirsiniz.

    yardımcı olur musun admin

    • yasirkula dedi ki:

      Gizlilik poliçesi oluşturup orada Alipay SDK’sinin topladığı telefon bilgilerini nasıl kullandığından bahsetmeniz lazım (belki Alipay SDK’sinin kendi gizlilik poliçesine link atmak da işe yarıyordur bilmiyorum). Ardından bu poliçenin linkini hem oyunun Google Play sayfasındaki gizlilik poliçesi (privacy policy) linki kısmına, hem de oyunun içindeki menülerden birine eklemeniz gerekiyor. Akabinde güncelleme atabilirsiniz.

      • efsane dedi ki:

        teşekkürler admin bir şey daha sorucam çok soru sordum biliyorum ama alipay sdknin ne veri topladığını nasıl bulabilirim gizlilik politikası ücretsiz site kurarak orda yayinlasam olur mu

      • yasirkula dedi ki:

        Alipay’in kendi privacy policy’sinde bulabilirsin. Kendi gizlilik politikanı ücretsiz siteye koyabilirsin.

      • efsane dedi ki:

        admin image veya buton siteye yönelndirme yapsam olur mu politika ve image veya butona site yönlendirme nasıl yapılır

      • yasirkula dedi ki:

        Bence siteye yönlendirme yapabilirsin. Bunun için Application.OpenURL kullanabilirsin.

      • efsane dedi ki:

        Merhaba Google Play Geliştiricisi,
        Amaç Yeniden Yönlendirme
        Uygulamalarınız Intent Redirection’a karşı savunmasız.
        Bu sorunu çözmek için bu Google Yardım Merkezi makalesindeki adımları izleyin.

      • yasirkula dedi ki:

        Daha önce karşılaşmadığım bir hata, büyük ihtimalle kullandığınız plugin’lerden birinden kaynaklanıyor. “Unity Intent Redirection” araması yapmanızı öneririm.

      • efsane dedi ki:

        admin unity de oyunu imzalayıp export ediyorum sonra android studio da düzenleme yapıyorum build de generate signed builde de aynı şekil imzalıyorum ama bu sürüm imzalanmamış hatası veriyor

      • yasirkula dedi ki:

        Android Studio’da imzalamayı bilmiyorum.

      • efsane dedi ki:

        buldum admin gerek kalmadı teşekkürler

    • efsane dedi ki:

      sa admin bir şey sorucam butona bastıktan sonra reklam açılıyor reklamı kapattıktan sonra butonun işlevini yerine getirmesini nasıl sağlıyabilirim

  7. alperen dedi ki:

    https://hizliresim.com/BMWJGc

    sa bu sorunları nasıl düzeltebilirim

    • yasirkula dedi ki:

      Aleykümselam. İlk uyarı önemsiz duruyor. Diğerleri de oyunun çıkışını veya performansını etkilemez ama oyun çökerse, neden çöktüğünü bulmayı kolaylaştırır. Gerekli adımların ney olduğunu bilmiyorum ama “Daha Fazla Bilgi”den herhalde ne yapmanız gerektiğini bulabilirsiniz. İsterseniz gelen sayfaları İngilizce okuyup anahtar kelimeleri “unity” kelimesi ile birlikte google’da da arayabilirsiniz.

  8. MT dedi ki:

    Hocam emeğinize sağlık.
    Katkı olması için, şöyle bir yöntem de var:
    Binlerce resmi png yapma, hepsinde boyut değiştirme, hepsine filtre ekleme vb vb. tüm senaryoları, PhotoShop’ta Action oluşturarak yapmak mümkün. 2-5-10 aşamalı bir işlem bile olsa, 1 defa yapılanları action olarak kaydedip, sonra klasör/alt-klasörlerindeki tüm dosyalara bu action’ı uygulayabiliyoruz.

    • yasirkula dedi ki:

      Bazı Texture’larda alpha kanalının içeriği, RGB kanallarından çok farklı oluyor. Eğer Photoshop bu resimleri PNG’e çevirirken alpha kanalını herhangi bir şekilde bozmuyorsa bence de güzel bir yöntemmiş. “Save for Web” seçilirse oluşan PNG’lerin boyutu da eminim epey optimize olacaktır. Ama eğer Action’lar sadece belli uzantılara sahip resimleri png’e çevirmemize imkan vermiyorsa, yani jpeg gibi diğer uzantıları da png’e çeviriyorsa bu biraz sıkıntı olur.

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.