Destek

Sıkça Sorulan Sorular

Derleme boyutu, yazı tipleri, glyph atlası ve çalışma zamanı performansı hakkında net cevaplar — gerçek geliştirici sorularından damıtıldı.

Derleme Boyutu ve Dağıtım

UniText derleme boyutumu şişirir mi? Derlemeye gerçekte ne giriyor?

Hayır. UniText, yazı tipi başına doku atlaslarını derlemenize gömmez. Glyph'ler çalışma zamanında paylaşılan bir atlasa (Texture2DArray tabanlı) rasterize edilir; glyph başına referans sayımı ve LRU tahliyesi kullanılır. Derlemenize yalnızca yazı tipi verisi girer — atlaslar asla. Bunun üzerine, yerleşik Yazı Tipi Sıkıştırması (Zstd, seviye 22) yazı tipi verisini Latin/Arapça için ~2.7× kadar küçültür (CJK daha mütevazıdır, ~1.3×).

.ttf dosyalarını saklamam ve göndermem gerekir mi?

Hayır. UniTextFont varlığı, yazı tipi baytlarını kendi içine gömer. Kaynak yazı tipine yapılan referans yalnızca Editör'de bulunur (#if UNITY_EDITOR içine sarılmıştır) — bir oyuncu derlemesinde hiç yer almaz, dolayısıyla çalışma zamanı bağımlılığı değildir ve bağımlılık aramasıyla bir AssetBundle'a çekilmez. Varlık oluşturulduktan sonra .ttf dosyasını silebilirsiniz.

.ttf dosyasını projeme hiç aktarmam gerekiyor mu?

Hayır. UniText araç penceresi aracılığıyla diskinizin herhangi bir yerinde bulunan bir .ttf dosyasından bir UniTextFont oluşturabilirsiniz (dosya iletişim kutusu baytları doğrudan okur). Yazı tipini projeye aktarmak isteğe bağlıdır.

UniText boş bir derlemeye gerçekte ne kadar ekliyor?

• WebGL: boş bir derleme ≈ 6–10 MB'dir (Unity sürümüne ve yüklü paketlere göre değişir); UniText kendi yerel kütüphanelerini (HarfBuzz, FreeType) ekler. Bunlar, Unity'nin kendi UI Toolkit Advanced Text Generator bileşeninin gönderdiği aynı endüstri standardı kütüphanelerdir — egzotik hiçbir şey yok (UniText yalnızca kendi kopyalarını taşır). • Android: iki mimarili bir APK her ikisini de taşır — mimari başına yaklaşık +4 MB. Ancak bir AAB yayınladığınızda, Google Play cihaza özel bir paket sunar, böylece kullanıcı her ikisini değil yalnızca kendi mimarisini (~4 MB) indirir.

UniText, CJK veya büyük yazı tipleri için TextMesh Pro ile nasıl karşılaştırılır?

TMP'yi Static atlas doldurma modunda kullanırken, tipik bir CJK yazı tipinin tam glyph setini derlemeye gömmek, derlemeyi onlarca ila yüzlerce MB şişirir (birkaç 4096²/8192² atlas; glyph sayısına ve çözünürlüğe bağlı olarak ~80–250 MB bekleyin). Kilit nokta: UniText'in ek yükü glyph sayısıyla ölçeklenmez — ister Latin ister tam CJK gönderin, aynı birkaç MB'dir.

Yazı tiplerini bir sunucudan veya CDN'den dinamik olarak yükleyebilir miyim?

Evet — bu geliştiricinin tarafındadır ve UniText engel olmaz. Yazı tipi baytlarını kendi kodunuzla (UnityWebRequest) indirin ve çalışma zamanında CreateFontAsset(byte[]) ile bunlardan bir UniTextFont oluşturun. Bir yazı tipini yalnızca ihtiyacınız olan karakterlere indirgemek için (alt kümeleme), UniText'in derleme zamanı aracını kullanın. Pakette yerleşik bir CDN otomatik yükleyici yoktur — bu bilinçli olarak motorun değil, projenin sorumluluğudur.

Yazı Tipleri ve Sistem Yazı Tipleri

UniText, işletim sistemi yazı tipini kullanabilir mi? Bellek ve başlangıç açısından maliyeti nedir?

Evet — SystemFont, yazı tipi dosyasını çalışma zamanında doğrudan işletim sisteminden okur, dolayısıyla derleme boyutu üzerinde hiçbir etkisi yoktur (hiçbir şey gömülmez). Çözümleme tembeldir (ilk kullanımda gerçekleşir), bu nedenle uygulama başlangıcını yavaşlatmaz.

WebGL sistem yazı tiplerini destekler mi?

Hayır — ve bu bir tarayıcı kısıtlamasıdır, UniText'in değil. Tarayıcı korumalı alanı işletim sistemi yazı tiplerini dışa açmaz. WebGL için, bir yazı tipini bir UniTextFont varlığına gömün (veya baytları kendiniz yükleyin — yukarıdaki CDN sorusuna bakın).

Glyph Atlası — SDF Detail ve Tile Size

“SDF Detail” ve “Tile Size Offset” gerçekte ne yapar?

Glyph'ler üç boyutta karolarda yaşar — 64, 128, 256 — ve boyut, kontur karmaşıklığından seçilir (çok sayıda segment → 128/256, basit bir kontur → 64). • SDF Detail, karmaşıklık tahmini üzerindeki bir çarpandır. Bunu artırdığınızda, halihazırda önemsiz olmayan bir glyph'in daha büyük bir karoya çıkma olasılığı artar. (Gerçekten basit bir şekil 64'te kalır — çarpan yalnızca eşiğin üzerindeki glyph'leri etkiler.) • Tile Size Offset, boyut merdiveni boyunca sabit bir adımdır (seçilen 64 + ofset 1 → 128; aralık −2..+2).

Performans için ikisinden hangisine öncelik vermeliyim?

Tek başına hiçbiri — ikisi de yalnızca nihai karo boyutunu belirler ve maliyet yalnızca o boyuta göre belirlenir. Aynı karo boyutuna çözümlenen iki kombinasyon tam olarak aynı maliyete sahiptir. Yine de kabul edilebilir kalite veren en küçük karo boyutunu hedefleyin.

Çalışma Zamanı Performansı

UniText glyph'leri ne zaman rasterize eder? Her karede bellek kopyalar mı?

Yalnızca bir glyph atlasta zaten yoksa — asla kare başına değil. “Hello world” için benzersiz glyph'leri rasterize eder: H e l o w r d. İkinci bir H hiçbir şey yapmaz; bir a yalnızca a'yı rasterize eder.

Bir anda çok sayıda yeni metin göründüğünde neden kısa bir takılma oluyor?

Maliyet, metnin uzunluğuyla değil — o karede rasterize edilen benzersiz, ilk kez görülen glyph'lerin sayısıyla orantılıdır. Kıyaslamamızda, ilk karedeki ~2000 benzersiz glyph, tipik bir Android cihazda ≈ 1 saniyedir; TMP ve UI Toolkit aynı senaryoda 10+ saniye alır. Önbelleğe alınmış glyph'leri yeniden kullanmak ücretsizdir.

Profiler'da bir UniText işi görmüyorum — çoklu iş parçacığı gerçekten çalışıyor mu?

UniText, sıcak yolda Unity Job System'e neredeyse hiç dayanmaz — tasarım gereği. Glyph rasterizasyonu (bize özgü lpSDF / lpMSDF) varsayılan olarak bir compute shader aracılığıyla GPU üzerinde çalışır; Burst işleri yalnızca compute kullanılamadığında devreye giren CPU yedeğidir. Ana çoklu iş parçacığı — şekillendirme, düzen, mesh üretimi — UniText'in kendi işletim sistemi iş parçacığı havuzunda çalışır (Unity Jobs değil, bu yüzden Jobs profiler'ında görünmezler). Yani “UniText işi yok” ifadesi “iş parçacıkları kapalı” anlamına gelmez: ya iş GPU'ya gitti, ya atlas zaten sıcak, ya da metin paralellik eşiğinin altında (kısa veya tek etiketler sırayla işlenir — bu şekilde daha ucuzdur).

MonoBehaviour.Update() performansa zarar verir mi? Tek bir UniTextManager'a ihtiyaç var mı?

“Update() yavaştır” sözü, sürüm derlemeleri için bir efsanedir. Yerel koddan yapılan sihirli metot çağrısının ek yükü gerçektir ama ihmal edilebilir düzeydedir (~1000 çağrı ≈ 0.16 ms) — darboğaz bu değildir. Naif koddaki asıl maliyet, geri çağırmanın kendisi değil, AoS bellek düzenidir; UniText, önemli olan yerlerde SoA uygular (Unicode öznitelikleri, metrikler, piksel başına arabellekler). (ECS'in hızlı olmasının nedeni de budur — “ECS sihri” değil, SoA sayesinde.) Ve UniText zaten merkezileştirilmiştir — yalnızca bir MonoBehaviour yöneticisi olarak değil: Update()'in kendisi neredeyse boştur ve ağır iş, Canvas render geri çağırmalarında tek bir toplu geçişte toplanır (bu da bileşenler arası paralelliği sağlayan şeydir).

Cevabınızı bulamadınız mı?

Discord'umuzda sorun — tam da bunun gibi sorular bu sayfayı şekillendirdi ve genellikle hızlı yanıt veriyoruz.

Sorularınız mı var?: [email protected]