Zum Inhalt springen
Menü
← Zurück zum Blog

Den 8K-Textfehler von Nova UI in WebGL beheben

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

Nageln Sie den Nova 8 K Text Bug in unserem WebGL Build

TL;DR

  • Symptom: Text länger als ~ 260-Zeichen gerendert Müll alle paar Glyphen—aber nur auf WebGL.
  • Wurzelursache: Der Fallback-Renderer von Nova hat Eckpunkte in eine 1 D RGBA-Textur gepackt, die breiter ist als die 8 192-Pixelgrenze von WebGL.
  • Fix: Kachelte den Puffer in 8 192-Pixelzeilen und ließ den Shader die gleiche Zeilenbreite verwenden.

Der Bug: Long Text Goes Glitch-City

QA bemerkte, dass jeder Dialog über 260 chars ≈ 1 024 glyphs Schredderte sich auf WebGL – Charaktere würden verschwinden oder tauschen alle ~ 20 Glyphen. Der Editor sah gut aus … bis wir
SystemSettings.UseFallbackRendering = true und die Korruption zeigte sich auch dort.

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

Wurzelursache: Übergroße und falsch ausgerichtete Fallback-Puffer

Nova wechselt zu einem Texturpuffer-Fallback wenn SSBOs nicht verfügbar sind (WebGL). Ein Glyphenvertex = 64 Bytes = 4 float4 Pixel. bescheiden
<TextBlock> mit 3224 Vertices wurden zu einem
12896 px × 1 Textur – weit über dem Limit von WebGL. Nachdem wir die Breite auf 8192 px eingespannt hatten, tauchte ein weiteres Artefakt auf: Der Shader glaubte immer noch, dass die Zeilen 16 384 px breit waren, so dass Edits in eine Zeile geschrieben und die GPU von einer anderen gelesen wurden.

Der Fix in zwei Commits

1 – Kacheln Sie die Puffertextur

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 – Sync the Shader Constant

#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

We also patched SetData() zu Ehren
shaderBufferStartIndex * 4 für RGBA-Pfade, so dass Runtime-Editierungen keine früheren Glyphen mehr stampfen.

Ergebnisse

✅ WebGL Build: null Artefakte, null Abstürze. ✅ Stand-alone Desktop Builds halten den 16 384-px SSBO Pfad. Der Redakteur zeigt das seltsame Verhalten immer noch. Aber derzeit keine priorität für einen fix.

Was kommt als Nächstes

Dieser Patch ist jetzt auf developErwarten Sie es in der nächsten Alpha. Wenn Sie auf ähnliche Nova UI Macken gestoßen sind, lassen Sie es uns wissen Discord oder Facebook Oder in den Kommentaren unten!

Schreibe einen Kommentar

Nach oben scrollen