Soporte

Preguntas frecuentes

Respuestas directas sobre el tamaño del build, las fuentes, el atlas de glifos y el rendimiento en runtime — destiladas de preguntas reales de desarrolladores.

Tamaño del build y distribución

¿UniText infla el tamaño de mi build? ¿Qué acaba realmente en el build?

No. UniText no hornea atlas de texturas por fuente en tu build. Los glifos se rasterizan en runtime en un atlas compartido (basado en Texture2DArray) con conteo de referencias por glifo y desalojo LRU. Solo los datos de la fuente van en tu build — nunca los atlas. Además, la compresión de fuentes integrada (Zstd, nivel 22) reduce los datos de fuente hasta ~2.7× para latín/árabe (con CJK es más modesto, ~1.3×).

¿Necesito conservar y distribuir los archivos .ttf?

No. El asset UniTextFont incrusta los bytes de la fuente dentro de sí mismo. La referencia a la fuente de origen es solo para el Editor (envuelta en #if UNITY_EDITOR) — simplemente no existe en un build de player, así que no es una dependencia en runtime y no se arrastrará a un AssetBundle mediante la búsqueda de dependencias. Puedes eliminar el .ttf una vez creado el asset.

¿Tengo siquiera que importar el .ttf a mi proyecto?

No. Puedes crear un UniTextFont a partir de un .ttf ubicado en cualquier lugar de tu disco mediante la ventana de herramientas de UniText (el diálogo de archivos lee los bytes directamente). Importar la fuente al proyecto es opcional.

¿Cuánto añade UniText realmente a un build vacío?

• WebGL: un build vacío ocupa ≈ 6–10 MB (varía según la versión de Unity y los paquetes instalados); UniText añade sus bibliotecas nativas (HarfBuzz, FreeType). Son las mismas bibliotecas estándar de la industria que incluye el propio Advanced Text Generator del UI Toolkit de Unity — nada exótico (UniText simplemente lleva sus propias copias). • Android: un APK con dos arquitecturas carga ambas — unos +4 MB por arquitectura. Pero cuando publicas un AAB, Google Play entrega un bundle específico para el dispositivo, así que el usuario descarga solo su propia arquitectura (~4 MB), no ambas.

¿Cómo se compara UniText con TextMesh Pro para CJK o fuentes grandes?

Con TMP en modo de población de atlas Static, hornear el conjunto completo de glifos de una fuente CJK típica infla el build en decenas o cientos de MB (varios atlas de 4096²/8192²; cuenta con ~80–250 MB según la cantidad de glifos y la resolución). El punto clave: el overhead de UniText no escala con la cantidad de glifos — son los mismos pocos MB tanto si distribuyes latín como CJK completo.

¿Puedo cargar fuentes dinámicamente desde un servidor o CDN?

Sí — eso corre por cuenta del desarrollador, y UniText no se interpone. Descarga los bytes de la fuente con tu propio código (UnityWebRequest) y crea un UniTextFont a partir de ellos en runtime mediante CreateFontAsset(byte[]). Para recortar una fuente y dejar solo los caracteres que necesitas (subsetting), usa la herramienta de UniText en tiempo de build. El paquete no incluye un cargador automático de CDN — es deliberadamente responsabilidad del proyecto, no del motor.

Fuentes y fuentes del sistema

¿Puede UniText usar la fuente del sistema del SO? ¿Qué cuesta en memoria y arranque?

Sí — SystemFont lee el archivo de fuente directamente del SO en runtime, así que no afecta al tamaño del build (no se hornea nada). La resolución es diferida (en el primer uso), así que no ralentiza el arranque de la app.

¿WebGL admite fuentes del sistema?

No — y es una limitación del navegador, no de UniText. El sandbox del navegador no expone las fuentes del SO. Para WebGL, incrusta una fuente en un asset UniTextFont (o carga los bytes tú mismo — consulta la pregunta sobre CDN más arriba).

Atlas de glifos — SDF Detail y Tile Size

¿Qué hacen realmente “SDF Detail” y “Tile Size Offset”?

Los glifos viven en tiles de tres tamaños — 64, 128, 256 — y el tamaño se elige a partir de la complejidad del contorno (muchos segmentos → 128/256, un contorno simple → 64). • SDF Detail es un multiplicador sobre la estimación de complejidad. Súbelo y un glifo que ya no es trivial tiene más probabilidades de pasar a un tile mayor. (Una forma genuinamente simple se queda en 64 — el multiplicador solo afecta a los glifos por encima del umbral.) • Tile Size Offset es un salto fijo a lo largo de la escala de tamaños (elegido 64 + offset 1 → 128; rango −2..+2).

¿Cuál de los dos debería priorizar para el rendimiento?

Ninguno por separado — ambos solo deciden el tamaño final del tile, y el coste lo fija únicamente ese tamaño. Dos combinaciones que resuelven al mismo tamaño de tile cuestan exactamente lo mismo. Apunta al tile más pequeño que aún dé una calidad aceptable.

Rendimiento en runtime

¿Cuándo rasteriza UniText los glifos? ¿Copia memoria en cada frame?

Solo cuando un glifo no está ya en el atlas — nunca en cada frame. Para “Hello world” rasteriza los glifos únicos H e l o w r d. Una segunda H no hace nada; una a rasteriza solo la a.

¿Por qué hay un breve tirón cuando aparece mucho texto nuevo de golpe?

El coste es proporcional a la cantidad de glifos únicos, vistos por primera vez, que se rasterizan en ese frame — no a la longitud del texto. En nuestro benchmark, ~2000 glifos únicos en el primer frame son ≈ 1 segundo en un dispositivo Android típico; TMP y UI Toolkit tardan 10+ segundos en el mismo escenario. Reutilizar glifos cacheados es gratis.

No veo ningún job de UniText en el Profiler — ¿está funcionando realmente el multithreading?

UniText apenas depende del Unity Job System en el hot path — por diseño. La rasterización de glifos (nuestro lpSDF / lpMSDF propietario) se ejecuta en la GPU mediante un compute shader por defecto; los jobs de Burst son solo el fallback en CPU cuando compute no está disponible. El multithreading principal — shaping, layout, generación de malla — se ejecuta en el propio pool de hilos del SO de UniText (no en Unity Jobs, por eso no aparecen en el profiler de Jobs). Así que “ningún job de UniText” no significa “los hilos están apagados”: o el trabajo fue a la GPU, o el atlas ya está caliente, o el texto está por debajo del umbral de paralelismo (las etiquetas cortas o individuales se procesan de forma secuencial — así es más barato).

¿MonoBehaviour.Update() perjudica el rendimiento? ¿Hace falta un único UniTextManager?

“Update() es lento” es un mito en los release builds. El overhead de la llamada al método mágico desde código nativo es real pero insignificante (~1000 llamadas ≈ 0.16 ms) — no es el cuello de botella. El coste real en código ingenuo es el layout de memoria AoS, no el callback en sí; UniText aplica SoA donde importa (atributos Unicode, métricas, buffers por píxel). (Por eso también es rápido ECS — por SoA, no por “magia de ECS”.) Y UniText está centralizado de todos modos — solo que no como un manager MonoBehaviour: Update() en sí está casi vacío, y el trabajo pesado se agrupa en una única pasada por lotes en los callbacks de render de Canvas (que es también lo que da el paralelismo entre componentes).

¿No encontraste tu respuesta?

Pregunta en nuestro Discord — preguntas como estas son justo las que dieron forma a esta página, y solemos responder rápido.

¿Preguntas?: [email protected]