UTF-8
Сегодня всё утро ушло на борьбу с различными языками в 3D редакторе. Была поставлена задача — добавить поддержку различных языков таких как Русский, Китайский, Английский, Французский, возможно и другие. Для внедрения различных языков нужны различные шрифты и растровое изображение каждого символа. Но как и обычно бывает, мы не знаем каким языком будет пользоваться человек. Может у него будет стоять основной язык Английский, а названия предметов и объектов он захочет на Русском или Китайском. В итоге придется подгружать отдельные шрифты создавать для них отдельные текстуры, занимать лишнюю память.
Был выбран самый простой и эффективный способ: — загружать в текстуру по букве используя необходимый нам шрифт и язык. Таким образом если в программе появилось слово на русском, то у нас просто добавится пара символов, которые, используются при выводе строки. Как результат, в памяти занимается лишь одна текстура, а вывод может быть на 20 и более языках, разом. Размер текстуры был выбран 1024×1024 с глубиной цвета 1 байт, на тестах этого размера хватило для весьма существенного числа шрифтов и языков. Всего получается будет использоваться ~1 Мб данных для хранения различных шрифтов в видеопамяти.
Что же будет если у нас не окажется места для новых шрифтов в нашей текстуре? Вначале происходит обнуление текстуры. После по новой вносятся все буквы видимые на экране и их шрифты. Обычно этого достаточно и программа дальше работает в обычном режиме. Но есть и исключительные ситуации, которые тоже решены, в тестах я использовал 200 шрифтов и выводил весь алфавит разом. Для того чтобы всё вошло, создаются дополнительные текстуры.
Но и это не всё. Вывод текста меняется когда текстур больше одной. Начинается группировка текста по текстурам. Например строка: «Съешь же ещё этих мягких французских булок, да выпей чаю.». Предположим у нас буква «е» окажется на второй текстуре. То при выводе будет выведена строка целиком без буквы «е». А вторым проходом уже после смены текстуры будет выведена буква «е» в нужных позициях. Это позволило значительно сократить число операций вывода на экран.