In che modo i giochi gestiscono il rendering del testo Unicode asiatico?


8

Attualmente sto implementando il rendering del testo nel mio motore di gioco e ho deciso di utilizzare BMfont di AngelCode per generare trame dei caratteri, e quindi avere quads con texture di rendering OpenGL per ogni personaggio. Funzionava alla grande, anche quando eseguivo il rendering di ogni singolo glifo supportato da FreeFont (in particolare FreeMono), fino a quando non ho provato a renderizzare il giapponese (il mio font giapponese preferito è Noto, fornito da Google).

Il rendering di ogni singolo glifo supportato da FreeMono a 16px ha prodotto una singola trama a 10 bit 1024x1024, perfettamente ragionevole considerando quante lingue sono coperte da esso. Il rendering di tutto ciò che è supportato da Noto Japanese, alla stessa dimensione, ha comportato 13 volte più trame, e a questa dimensione la maggior parte dei glifi è troppo stretta per essere leggibile (non riesco a leggere il giapponese, ma se potessi penso che lo farei ho ancora molti problemi a leggere questo testo).

La mia domanda è duplice:

1) In che modo i giochi o le app mobili gestiscono il piccolo testo giapponese? Si attaccano a un sottoinsieme del kanji, usano un carattere speciale o c'è una dimensione minima del carattere?

2) In che modo i giochi in genere gestiscono il numero assurdamente enorme di glifi richiesti da giapponese, cinese, coreano e altre lingue? Usano FreeType (o qualcosa di simile) per rendere il testo al volo?

Nota: ho provato Meiryo (che non ho la licenza da usare nel mio gioco) e il risultato era molto più leggibile a 16px (comunque ancora angusto), ma richiedevo comunque 14 trame per adattarsi a tutto.

Risposte:


6

Sto usando la libreria freetype ( http://www.freetype.org/ ) per caricare glifi dai caratteri freetype e quindi uso il bin bin per generare una trama / atlante glifo durante il runtime, in modo simile a come fa freetype-gl ( https : //code.google.com/p/freetype-gl/ ).

Quando il gioco viene inizializzato, genera un atlante glifo con i caratteri stampabili dell'intervallo ASCII. Questo atlante non cambierà durante il gioco. Un atlante aggiuntivo viene utilizzato per i caratteri non ascii.

Ogni volta che una stringa viene accodata per il disegno, controllo se è presente un glifo che non è stato ancora caricato. Se si incontra un tale glifo, segnare l'atlante di glifo come sporco e rigenerare l'atlante di glifo prima del rendering. Se l'atlante è pieno, i glifi non ascii vengono eliminati se non sono stati utilizzati per un certo periodo di tempo / fotogrammi.

C'è un certo sovraccarico indotto caricando glifi al volo e ricostruendo l'atlante glifo, ma d'altra parte, qualsiasi glifo supportato dal font può essere usato con questo sistema.

Inoltre, non sto ancora disegnando molte cose oltre al testo ...


5

Nei giochi a cui ho lavorato, abbiamo limitato il sottoinsieme di personaggi usati per cinese, giapponese e coreano (insieme denominato CJK) solo a quelli necessari per visualizzare il testo nel gioco.

In altre parole, non abbiamo tentato di stipare tutti i possibili personaggi; abbiamo appena preso il database del testo CJK dai nostri team di localizzazione, fatto un passaggio su di esso per trovare tutti i punti di codice Unicode che si sono verificati almeno una volta nel testo e generato un file di configurazione BMFont per disporre un atlante esattamente per quei caratteri. (Era tutto automatizzato, quindi ogni volta che ottenevamo un nuovo rilascio loc, potevamo rigenerare l'elenco dei caratteri e dei caratteri secondo necessità.)

Come puoi immaginare, questo riduce notevolmente il numero di personaggi richiesti. Abbiamo anche compresso le bitmap dei caratteri con DXT1, che funziona abbastanza bene per il testo (anche con antialiasing). BMFont ha anche un'opzione per usare tutti e quattro i canali di colore di un'immagine come pagine separate (ottenendo così il doppio del numero di caratteri per pagina), ma questo non gioca altrettanto bene con la compressione, quindi non abbiamo finito per usarlo.

Non sono sicuro delle dimensioni dei caratteri, però. Se non hai amici che leggono CJK che possono dare un'occhiata e dirti se è troppo piccolo, puoi provare a guardare i film sottotitolati CJK per avere un'idea di quanto sia grande il testo.


Grazie per l'input. Cosa succede se l'utente è autorizzato a inserire del testo, però? Ad esempio, inserendo il nome del giocatore o una finestra di chat per un gioco online.
Haydn V. Harach,

@ HaydnV.Harach Sì, l'inserimento del testo è un problema. Per la chat potrebbe funzionare per limitare le cose ai 1000 caratteri cinesi più comuni, o qualcosa del genere; dovresti chiedere a qualcuno che ne sappia di più su queste lingue per vedere se sarebbe praticabile. Per il nome del giocatore, potresti renderlo con FreeType una volta e memorizzare nella cache la bitmap da utilizzare come "carattere" extra nel tuo renderer.
Nathan Reed,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.