Bagaimana game menangani rendering teks unicode Asia?

8

Saat ini saya sedang dalam proses mengimplementasikan rendering teks di mesin gim saya, dan saya memutuskan untuk menggunakan BMC milik AngelCode untuk menghasilkan tekstur font, dan kemudian membuat OpenGL membuat quads yang bertekstur untuk setiap karakter. Ini bekerja hebat, bahkan ketika merender setiap mesin terbang tunggal yang didukung oleh FreeFont (khususnya FreeMono), sampai saya mencoba membuat bahasa Jepang (Jenis huruf Jepang saya adalah Noto, disediakan oleh Google).

Rendering setiap mesin terbang tunggal yang didukung oleh FreeMono pada 16px menghasilkan tekstur 10bit 1024x1024 tunggal, sangat masuk akal mengingat berapa banyak bahasa yang tercakup olehnya. Merender semua yang didukung oleh Noto Jepang, pada ukuran yang sama, menghasilkan tekstur 13 kali lebih banyak, dan pada ukuran ini sebagian besar mesin terbang terlalu sempit untuk dapat dibaca (saya tidak bisa membaca bahasa Jepang, tetapi jika saya bisa saya pikir saya akan masih memiliki banyak kesulitan membaca teks ini).

Pertanyaan saya ada dua:

1) Bagaimana gim, atau aplikasi seluler, menangani teks Jepang kecil? Apakah mereka menempel pada subset dari kanji, menggunakan font khusus, atau adakah ukuran font minimum?

2) Bagaimana permainan biasanya menangani jumlah mesin terbang yang sangat besar yang diperlukan oleh bahasa Jepang, Cina, Korea, dan bahasa lainnya? Apakah mereka menggunakan FreeType (atau sesuatu yang serupa) untuk membuat teks on-the-fly?

Catatan: Saya mencoba Meiryo (yang saya tidak memiliki lisensi untuk digunakan dalam permainan saya) dan hasilnya jauh lebih mudah dibaca pada 16px (masih sempit), tetapi masih membutuhkan 14 tekstur untuk memenuhi semuanya.

Haydn V. Harach
sumber

Jawaban:

6

Saya menggunakan perpustakaan freetype ( http://www.freetype.org/ ) untuk memuat mesin terbang dari font freetype dan kemudian menggunakan kemasan bin untuk menghasilkan tekstur / atlas mesin terbang selama runtime, mirip dengan bagaimana freetype-gl melakukannya ( https : //code.google.com/p/freetype-gl/ ).

Ketika permainan diinisialisasi, saya membuat atlas mesin terbang dengan karakter yang dapat dicetak dari kisaran ASCII. Atlas ini tidak akan berubah selama pertandingan. Atlas tambahan digunakan untuk karakter non-ascii.

Setiap kali string di enqueued untuk menggambar, saya memeriksa apakah ada mesin terbang yang belum dimuat. Jika mesin terbang seperti itu ditemukan, saya menandai atlas mesin terbang sebagai kotor dan meregenerasi atlas mesin terbang sebelum rendering. Jika atlas penuh, mesin terbang non-ascii dijatuhkan jika belum digunakan untuk jangka waktu / bingkai tertentu.

Ada overhead tertentu yang disebabkan oleh memuat mesin terbang dengan cepat dan membangun kembali atlas mesin terbang, tetapi di sisi lain, mesin terbang apa pun yang didukung oleh font dapat digunakan dengan sistem ini.

Kemudian lagi, saya belum menggambar banyak hal selain teks ...

Exilyth
sumber
5

Dalam game yang saya garap, kami membatasi subset karakter yang digunakan untuk Cina, Jepang, dan Korea (bersama-sama disebut CJK) hanya untuk yang diminta untuk menampilkan teks dalam game.

Dengan kata lain, kami tidak berusaha menjejalkan dalam setiap karakter yang mungkin; kami baru saja mengambil basis data teks CJK dari tim pelokalan kami, lalu melewatinya untuk menemukan semua titik kode Unicode yang terjadi setidaknya satu kali dalam teks, dan menghasilkan file konfigurasi BMFont untuk meletakkan atlas untuk karakter yang tepat. (Semuanya otomatis, jadi setiap kali kami mendapat setetes loc baru, kami dapat membuat ulang daftar karakter dan font sesuai kebutuhan.)

Seperti yang dapat Anda bayangkan, ini sangat mengurangi jumlah karakter yang diperlukan. Kami juga mengompresi bitmap font dengan DXT1, yang bekerja cukup baik untuk teks (bahkan antialiased). BMFont juga memiliki opsi untuk menggunakan keempat saluran warna dari suatu gambar sebagai halaman terpisah (sehingga mendapatkan 4x jumlah karakter per halaman), tetapi ini tidak berjalan sebaik kompresi, jadi kami tidak menggunakannya.

Saya tidak yakin tentang ukuran font. Jika Anda belum memiliki teman yang membaca CJK yang dapat melihat dan memberi tahu Anda jika ini terlalu kecil, Anda dapat mencoba melihat film-film subtitle CJK untuk mengetahui seberapa besar teks yang ada.

Nathan Reed
sumber
Terima kasih atas masukannya. Apa yang terjadi jika pengguna diizinkan memasukkan teks? Misalnya, memasukkan nama pemain, atau kotak obrolan untuk game online.
Haydn V. Harach
@ HaydnV.Harach Ya, memasukkan teks adalah masalah. Untuk obrolan, membatasi jumlah karakter Cina yang paling umum adalah 1000, atau sesuatu seperti itu; Anda harus bertanya kepada seseorang yang tahu lebih banyak tentang bahasa-bahasa ini untuk melihat apakah itu bisa dilakukan. Untuk nama pemain, Anda mungkin dapat merendernya dengan FreeType satu kali dan men-cache bitmap untuk digunakan sebagai "karakter" tambahan dalam renderer Anda.
Nathan Reed