Comment les jeux gèrent-ils le rendu du texte unicode asiatique?

8

Je suis actuellement en train d'implémenter le rendu de texte dans mon moteur de jeu, et j'ai décidé d'utiliser BMfont d'AngelCode pour générer des textures de police, puis d'avoir des quadrillages texturés de rendu OpenGL pour chaque personnage. Cela a très bien fonctionné, même lors du rendu de chaque glyphe pris en charge par FreeFont (FreeMono en particulier), jusqu'à ce que j'essaie de rendre le japonais (ma police japonaise de choix est Noto, fournie par Google).

Le rendu de chaque glyphe unique pris en charge par FreeMono à 16 pixels a donné une seule texture 1024 x 1024 8 bits, parfaitement raisonnable compte tenu du nombre de langues couvertes par celui-ci. Le rendu de tout ce qui est pris en charge par Noto Japanese, à la même taille, a entraîné 13 fois plus de textures, et à cette taille, la plupart des glyphes sont trop exigus pour être lisibles (je ne peux pas lire le japonais, mais si je le pouvais, je pense que je le ferais ont encore beaucoup de mal à lire ce texte).

Ma question est double:

1) Comment les jeux ou les applications mobiles gèrent-ils les petits textes japonais? Collent-ils à un sous-ensemble des kanji, utilisent-ils une police spéciale ou existe-t-il une taille de police minimale?

2) Comment les jeux gèrent-ils généralement le nombre absurdement massif de glyphes requis par le japonais, le chinois, le coréen et d'autres langues? Utilisent-ils FreeType (ou quelque chose de similaire) pour rendre le texte à la volée?

Remarque: j'ai essayé Meiryo (que je n'ai pas la licence à utiliser dans mon jeu) et le résultat était beaucoup plus lisible à 16 pixels (toujours à l'étroit), mais il fallait toujours 14 textures pour tout s'adapter.

Haydn V. Harach
la source

Réponses:

6

J'utilise la bibliothèque freetype ( http://www.freetype.org/ ) pour charger des glyphes à partir de polices freetype, puis j'utilise le bin bin pour générer une texture / atlas de glyphe pendant l'exécution, similaire à la façon dont freetype-gl le fait ( https : //code.google.com/p/freetype-gl/ ).

Lorsque le jeu est initialisé, je génère un atlas de glyphes avec les caractères imprimables de la gamme ASCII. Cet atlas ne changera pas pendant le jeu. Un atlas supplémentaire est utilisé pour les caractères non ascii.

Chaque fois qu'une chaîne est mise en file d'attente pour le dessin, je vérifie s'il y a un glyphe qui n'a pas encore été chargé. Si un tel glyphe est rencontré, je marque l'atlas de glyphe comme sale et régénère l'atlas de glyphe avant le rendu. Si l'atlas est plein, les glyphes non ascii sont supprimés s'ils n'ont pas été utilisés pendant un certain temps / images.

Il y a une certaine surcharge induite par le chargement des glyphes à la volée et la reconstruction de l'atlas des glyphes, mais d'un autre côté, tous les glyphes pris en charge par la police peuvent être utilisés avec ce système.

Là encore, je ne dessine pas encore beaucoup de choses en plus du texte ...

Exilyth
la source
5

Dans les jeux sur lesquels j'ai travaillé, nous avons restreint le sous-ensemble de caractères utilisés pour le chinois, le japonais et le coréen (appelés ensemble CJK) à ceux requis pour afficher le texte dans le jeu.

En d'autres termes, nous n'avons pas essayé de fourrer tous les personnages possibles; nous venons de prendre la base de données de texte CJK de nos équipes de localisation, de la passer en revue pour trouver tous les points de code Unicode qui se sont produits au moins une fois dans le texte et de générer un fichier de configuration BMFont pour disposer un atlas pour exactement ces caractères. (Tout était automatisé, donc à chaque fois que nous obtenions un nouveau drop loc, nous pouvions régénérer la liste des caractères et des polices selon les besoins.)

Comme vous pouvez l'imaginer, cela réduit considérablement le nombre de caractères requis. Nous avons également compressé les bitmaps de polices avec DXT1, qui fonctionne assez bien pour le texte (même anti-crénelé). BMFont a également la possibilité d'utiliser les quatre canaux de couleur d'une image en tant que pages distinctes (obtenant ainsi 4x le nombre de caractères par page), mais cela ne fonctionne pas aussi bien avec la compression, nous n'avons donc pas fini par l'utiliser.

Cependant, je ne suis pas sûr de la taille des polices. Si vous n'avez pas d'amis lisant CJK qui peuvent jeter un coup d'œil et vous dire s'il est trop petit, vous pouvez essayer de regarder des films sous-titrés CJK pour avoir une idée de la taille du texte.

Nathan Reed
la source
Merci pour la contribution. Que se passe-t-il si l'utilisateur est autorisé à saisir du texte? Par exemple, saisir le nom du joueur ou une boîte de discussion pour un jeu en ligne.
Haydn V. Harach
@ HaydnV.Harach Oui, la saisie de texte est un problème. Pour le chat, cela peut fonctionner pour limiter les choses aux 1000 caractères chinois les plus courants, ou quelque chose comme ça; il faudrait demander à quelqu'un qui en sait plus sur ces langues de voir si cela serait viable. Pour le nom du joueur, vous pouvez peut-être le rendre avec FreeType une fois et mettre en cache le bitmap pour l'utiliser comme "caractère" supplémentaire dans votre moteur de rendu.
Nathan Reed