Vai al contenuto
Menu
← Torna al blog

Correzione del bug del testo 8K di Nova UI in WebGL

Frustrated developer comparing broken glyph rows in the browser console and Unity Editor.

Correzione del problema del testo 8K di Nova nella nostra build WebGL

14 giugno 2025 · 6 minuti di lettura

In breve

  • Sintomo: i testi di oltre circa 260 caratteri mostravano artefatti ogni pochi glifi, ma solo in WebGL.
  • Causa: il renderer di fallback di Nova inseriva i vertici in una texture RGBA monodimensionale più larga del limite WebGL di 8192 pixel.
  • Correzione: suddividere il buffer in righe di 8192 pixel e usare la stessa larghezza nello shader.

Il problema: artefatti nei testi lunghi

I test hanno rilevato che le finestre di dialogo con oltre 260 caratteri ≈ 1024 glifi si deformavano in WebGL: i caratteri scomparivano o si scambiavano circa ogni 20 glifi. Nell’editor tutto sembrava corretto, finché non abbiamo forzato SystemSettings.UseFallbackRendering = true. Il problema è apparso anche lì.

// WebGL console
Texture has out of range width (got 12800 max supported 8192)

Causa: buffer di fallback troppo grandi e disallineati

Nova usa un buffer di texture quando gli SSBO non sono disponibili, come in WebGL. Un vertice di un glifo occupa 64 byte, ossia quattro pixel float4. Un <TextBlock> con 3224 vertici generava una texture di 12896 × 1 pixel, ben oltre il limite WebGL. Dopo aver limitato la larghezza a 8192 pixel, è emerso un altro problema: lo shader continuava a presumere righe di 16384 pixel. Le modifiche scrivevano quindi in una riga mentre la GPU leggeva da un’altra.

La correzione in due commit

1. Suddividere il buffer di texture in righe

int maxEdge = 8192;
int width   = Mathf.Min(numPixels, maxEdge);
int height  = Mathf.CeilToInt((float)numPixels / width);
texture = new Texture2D(width, height, TextureFormat.RGBAFloat, false, true);

2. Sincronizzare la costante dello shader

#if defined(NOVA_FALLBACK_RENDERING)
  #if defined(UNITY_WEBGL) || defined(UNITY_EDITOR)
    #define MAX_TEXTURE_DIMENSION 8192u
  #else
    #define MAX_TEXTURE_DIMENSION 16384u
  #endif
#endif

Abbiamo corretto anche SetData() affinché rispettasse shaderBufferStartIndex * 4 nei percorsi RGBA. Le modifiche durante l’esecuzione non sovrascrivono più i glifi precedenti.

Risultati

Build WebGL: nessun artefatto e nessun arresto anomalo. Le build desktop con SSBO da 16384 pixel sono rimaste invariate. L’editor presenta ancora qualche comportamento insolito, ma al momento non è una priorità.

Prossimi passi

La correzione è già nel ramo develop e dovrebbe arrivare nella prossima versione alfa. Se avete riscontrato problemi simili con Nova UI, segnalateli su Discord, Facebook o nei commenti.

Discord · Facebook

Leave a Comment

Scroll to Top