Podpora

Často kladené otázky

Přímé odpovědi na otázky ohledně velikosti buildu, písem, glyfového atlasu a výkonu za běhu — vydestilované ze skutečných dotazů vývojářů.

Velikost buildu a distribuce

Nafoukne UniText velikost mého buildu? Co vlastně skončí v buildu?

Ne. UniText nepeče texturové atlasy pro jednotlivá písma do vašeho buildu. Glyfy se rasterizují za běhu do sdíleného atlasu (založeného na Texture2DArray) s počítáním referencí na glyf a vyřazováním LRU. Ve vašem buildu se dodávají pouze data písem — nikdy atlasy. Navíc vestavěná komprese písem (Zstd, úroveň 22) zmenší data písem až ~2.7× u latinky/arabštiny (u CJK je to skromnější, ~1.3×).

Musím si ponechat a dodávat soubory .ttf?

Ne. Asset UniTextFont vkládá bajty písma přímo do sebe. Odkaz na zdrojové písmo existuje pouze v Editoru (obalený v #if UNITY_EDITOR) — v player buildu prostě neexistuje, takže není závislostí za běhu a nebude vtažen do AssetBundle přes vyhledávání závislostí. Soubor .ttf můžete po vytvoření assetu smazat.

Musím vůbec soubor .ttf importovat do svého projektu?

Ne. UniTextFont můžete sestavit ze souboru .ttf umístěného kdekoli na disku přes okno nástroje UniText (dialog souboru čte bajty přímo). Import písma do projektu je nepovinný.

Kolik toho UniText vlastně přidá k prázdnému buildu?

• WebGL: prázdný build má ≈ 6–10 MB (liší se podle verze Unity a nainstalovaných balíčků); UniText přidává své nativní knihovny (HarfBuzz, FreeType). Jsou to tytéž knihovny odpovídající průmyslovým standardům, které dodává i vlastní Advanced Text Generator v UI Toolkit od Unity — nic exotického (UniText si jen nese vlastní kopie). • Android: APK se dvěma architekturami nese obě — přibližně +4 MB na architekturu. Ale když publikujete AAB, Google Play doručí balíček specifický pro dané zařízení, takže si uživatel stáhne pouze svou vlastní architekturu (~4 MB), ne obě.

Jak si UniText stojí ve srovnání s TextMesh Pro u CJK nebo velkých písem?

S TMP v režimu Static (naplňování atlasu) nafoukne zapečení kompletní sady glyfů typického CJK písma build o desítky až stovky MB (několik atlasů 4096²/8192²; počítejte s ~80–250 MB podle počtu glyfů a rozlišení). Klíčový bod: režie UniText neškáluje s počtem glyfů — je to stejných pár MB, ať dodáváte latinku nebo plné CJK.

Mohu načítat písma dynamicky ze serveru nebo CDN?

Ano — to je na straně vývojáře a UniText v tom nebrání. Bajty písma stáhněte vlastním kódem (UnityWebRequest) a za běhu z nich sestavte UniTextFont přes CreateFontAsset(byte[]). Chcete-li písmo osekat jen na znaky, které potřebujete (subsetting), použijte nástroj UniText pro build-time. V balíčku není žádný vestavěný automatický načítač z CDN — to je záměrně odpovědnost projektu, ne enginu.

Písma a systémová písma

Může UniText používat systémové písmo OS? Kolik to stojí v paměti a při startu?

Ano — SystemFont čte soubor písma přímo z OS za běhu, takže nemá vliv na velikost buildu (nic se nepeče). Rozlišení je líné (při prvním použití), takže nezpomaluje spuštění aplikace.

Podporuje WebGL systémová písma?

Ne — a to je omezení prohlížeče, ne UniText. Sandbox prohlížeče neposkytuje přístup k písmům OS. Pro WebGL vložte písmo do assetu UniTextFont (nebo si bajty načtěte sami — viz otázka o CDN výše).

Glyfový atlas — SDF Detail a velikost dlaždice

Co vlastně dělají „SDF Detail“ a „Tile Size Offset“?

Glyfy žijí v dlaždicích tří velikostí — 64, 128, 256 — a velikost se volí podle složitosti obrysu (mnoho segmentů → 128/256, jednoduchý obrys → 64). • SDF Detail je násobitel odhadu složitosti. Zvyšte jej a už tak netriviální glyf se s větší pravděpodobností posune na větší dlaždici. (Skutečně jednoduchý tvar zůstane na 64 — násobitel ovlivňuje jen glyfy nad prahem.) • Tile Size Offset je pevný krok po žebříčku velikostí (zvolená 64 + offset 1 → 128; rozsah −2..+2).

Kterému z těch dvou mám dát pro výkon přednost?

Ani jednomu samostatně — oba jen určují výslednou velikost dlaždice a náklady jsou dané pouze touto velikostí. Dvě kombinace, které vedou ke stejné velikosti dlaždice, stojí přesně totéž. Miřte na nejmenší velikost dlaždice, která ještě dává přijatelnou kvalitu.

Výkon za běhu

Kdy UniText rasterizuje glyfy? Kopíruje paměť každý snímek?

Pouze když glyf ještě není v atlasu — nikdy každý snímek. U „Hello world“ rasterizuje unikátní glyfy H e l o w r d. Druhé H neudělá nic; a rasterizuje jen a.

Proč nastane krátké zaškobrtnutí, když se najednou objeví hodně nového textu?

Náklady jsou úměrné počtu unikátních, poprvé viděných glyfů rasterizovaných v daném snímku — ne délce textu. V našem benchmarku představuje ~2000 unikátních glyfů v prvním snímku ≈ 1 sekundu na typickém zařízení s Androidem; TMP a UI Toolkit potřebují ve stejném scénáři 10+ sekund. Opětovné použití glyfů z cache je zdarma.

Nevidím v Profileru žádnou úlohu UniText — funguje vícevláknové zpracování vůbec?

UniText se na horké cestě téměř nespoléhá na Unity Job System — záměrně. Rasterizace glyfů (naše proprietární lpSDF / lpMSDF) běží ve výchozím nastavení na GPU přes compute shader; Burst úlohy jsou jen záložní řešení na CPU, když compute není k dispozici. Hlavní vícevláknové zpracování — shaping, rozložení, generování meshe — běží na vlastním fondu OS vláken UniText (ne na Unity Jobs, proto se neobjevují v profileru Jobs). Takže „žádná úloha UniText“ neznamená „vlákna jsou vypnutá“: buď práce šla na GPU, nebo je atlas už zahřátý, nebo je text pod prahem paralelizace (krátké nebo jednotlivé popisky se zpracovávají sekvenčně — je to tak levnější).

Škodí MonoBehaviour.Update() výkonu? Potřebujete jeden UniTextManager?

„Update() je pomalý“ je pro release buildy mýtus. Režie volání magické metody z nativního kódu je reálná, ale zanedbatelná (~1000 volání ≈ 0.16 ms) — není to úzké hrdlo. Skutečné náklady v naivním kódu tvoří paměťové rozložení AoS, ne samotný callback; UniText používá SoA tam, kde na tom záleží (atributy Unicode, metriky, bufery po pixelech). (To je také důvod, proč je ECS rychlé — kvůli SoA, ne kvůli „magii ECS“.) A UniText je stejně centralizovaný — jen ne jako MonoBehaviour manažer: samotný Update() je téměř prázdný a těžká práce se shromažďuje do jediného dávkového průchodu na render callbacích Canvas (což je také to, co dává paralelismus napříč komponentami).

Nenašli jste svou odpověď?

Zeptejte se na našem Discordu — právě otázky jako tyto formovaly tuto stránku a obvykle odpovídáme rychle.