¿Cómo manejan los juegos la representación de texto Unicode asiático?

8

Actualmente estoy en el proceso de implementar el renderizado de texto en mi motor de juego, y decidí utilizar BMfont de AngelCode para generar texturas de fuente, y luego tener quads texturizados de renderizado OpenGL para cada personaje. Esto funcionó muy bien, incluso cuando rendericé cada glifo admitido por FreeFont (FreeMono en particular), hasta que intenté renderizar en japonés (mi fuente japonesa preferida es Noto, proporcionada por Google).

Renderizar cada glifo admitido por FreeMono a 16px dio como resultado una única textura de 1024x1024 8 bits, perfectamente razonable teniendo en cuenta cuántos idiomas cubre. Renderizar todo lo admitido por Noto Japanese, en el mismo tamaño, dio como resultado 13 veces más texturas, y en este tamaño la mayoría de los glifos son demasiado pequeños para ser legibles (no puedo leer japonés, pero si pudiera creo que lo haría) todavía tengo muchos problemas para leer este texto).

Mi pregunta es doble:

1) ¿Cómo manejan los juegos, o aplicaciones móviles, pequeños textos japoneses? ¿Se adhieren a un subconjunto de kanji, usan una fuente especial o hay un tamaño de fuente mínimo?

2) ¿Cómo manejan los juegos la cantidad absurdamente masiva de glifos requerida por japonés, chino, coreano y otros idiomas? ¿Utilizan FreeType (o algo similar) para representar el texto sobre la marcha?

Nota: Probé Meiryo (que no tengo la licencia para usar en mi juego) y el resultado fue mucho más legible a 16px (aunque estrecho), pero aún requirió 14 texturas para adaptarse a todo.

Haydn V. Harach
fuente

Respuestas:

6

Estoy usando la biblioteca freetype ( http://www.freetype.org/ ) para cargar glifos de fuentes freetype y luego uso el empaquetado bin para generar una textura / atlas de glifos durante el tiempo de ejecución, similar a cómo lo hace freetype-gl ( https : //code.google.com/p/freetype-gl/ ).

Cuando se inicia el juego, genero un atlas de glifos con los caracteres imprimibles del rango ASCII. Este atlas no cambiará durante el juego. Se utiliza un atlas adicional para los caracteres que no son ascii.

Cada vez que se pone en cola una cadena para dibujar, verifico si hay un glifo que aún no se ha cargado. Si se encuentra dicho glifo, marco el atlas de glifos como sucio y regenero el atlas de glifos antes de renderizar. Si el atlas está lleno, los glifos no ascii se descartan si no se han utilizado durante una cierta cantidad de tiempo / fotogramas.

Hay una cierta sobrecarga inducida por cargar glifos sobre la marcha y reconstruir el atlas de glifos, pero por otro lado, cualquier glifos admitidos por la fuente se pueden usar con este sistema.

Por otra parte, todavía no estoy dibujando muchas cosas además del texto ...

Exilyth
fuente
5

En los juegos en los que he trabajado, restringimos el subconjunto de caracteres utilizados para chino, japonés y coreano (en conjunto, denominados CJK) a solo aquellos necesarios para mostrar el texto en el juego.

En otras palabras, no intentamos meter en todos los personajes posibles; acabamos de tomar la base de datos de texto CJK de nuestros equipos de localización, pasamos por encima para encontrar todos los puntos de código Unicode que ocurrieron al menos una vez en el texto, y generamos un archivo de configuración BMFont para diseñar un atlas para exactamente esos caracteres. (Todo estaba automatizado, por lo que cada vez que recibimos un nuevo loc drop, podríamos regenerar la lista de caracteres y las fuentes según sea necesario).

Como puede imaginar, esto reduce enormemente la cantidad de caracteres necesarios. También comprimimos los mapas de bits de fuentes con DXT1, que funciona bastante bien para texto (incluso antialias). BMFont también tiene una opción para usar los cuatro canales de color de una imagen como páginas separadas (obteniendo así 4 veces más caracteres por página), pero esto no funciona tan bien con la compresión, por lo que no terminamos usándolo.

Sin embargo, no estoy seguro de los tamaños de fuente. Si no tiene amigos lectores de CJK que puedan echarle un vistazo y decirle si es demasiado pequeño, puede intentar mirar películas subtituladas en CJK para tener una idea de qué tan grande es el texto.

Nathan Reed
fuente
Gracias por el aporte. ¿Qué sucede si el usuario puede ingresar texto? Por ejemplo, ingresar el nombre del jugador o un cuadro de chat para un juego en línea.
Haydn V. Harach
@ HaydnV.Harach Sí, ingresar texto es un problema. Para el chat, podría funcionar limitar las cosas a los 1000 caracteres chinos más comunes, o algo así; tendrías que preguntarle a alguien que sepa más sobre estos idiomas para ver si eso sería viable. Para el nombre del jugador, tal vez podría renderizarlo con FreeType una vez y almacenar en caché el mapa de bits para usarlo como un "personaje" adicional en su renderizador.
Nathan Reed