kvisaz (kvisaz) wrote,
kvisaz
kvisaz

Categories:

НЕ, He и пожиратели пикселей

Иногда программирование - это боль и обида. Я хотел поставить в игре вывод всех слов в обычном нижнем регистре, а то в верхнем регистре на первых, самых коротких словах возникали ребусы с очень похожими словами. Английский HE (он) был неотличим от русского НЕ (отрицание), да и другие слова сильно путались.

Я думал это дело пяти минут, просто убрал в одном месте функцию upperCase(), запустил и...



Буквы взбунтовались и вышли из шеренги! Это бесячий баг, потому что на первый взгляд вроде все почти нормально, почти... но что-то сразу ощущается не так (и выравнивание поехало)



Исходные данные:
- шрифт растровый, то есть все буквы заранее отрендерены как картинки в некотором, заведомо большем, разрешении
- все тексты в игре выводились этим шрифтом в разных масштабах и все было хорошо

Поиск:
Потратил два чаcа... Ну, полтора. Пробовал и так, и этак, видел разные интересные эффекты (при выравнивании слов относительно иконки и масштабировании эффект наиболее заметен, если убрать хоть одну операцию - эффект исчезал).

Наконец, понял - я пал жертвой сэмплирования. Другими словами, если мы уменьшаем растровую картинку - неизбежны потери. Эти потери минимальны, когда коэффициент масштабирования близок к двум. Не хочу тут еще картинку впихивать, на пальцах объясню:

Шесть пикселей OOOOOO пропорционально делятся только на два -  OOO | OOO --> OOO

Если я хочу уменьшить картинку в N, где N - не степень двойки, возможны искажения. Вступает в силу эффект "неделимой единицы", OOOO | OO -> три или два пикселя, мы не можем получить дробное число пикселей. При округлении до ближайшего целого мы получаем погрешность, которая обычно незаметна в большинстве случаев.

Движок, конечно, очень старается компенсировать все работы с растром, поэтому к примеру, вместо двух пикселей будет два пикселя черного цвета и один полупрозрачный. Но потери пикселей неизбежны - и это очень сильно заметно на буквах в нижнем регистре, которые более изящны и тонки, чем в верхнем регистре.

Буквы d и i в слове disease - уходят вверх как раз на 1 пиксель от своего законного места.

Решение
Пришлось для фишек сделать дополнительный растровый шрифт, сразу выведя буквы в нужном размере - и в самом игровом движке задавать только этот размер. Я не хотел этого, это дополнительный ресурсный файл. Да и когда все буквы были в верхнем регистре - все масштабировалось нормально. Но маленькие буквы нижнего регистра оказались слишком нежными.





Нежные картинки лучше не растягивать и не сжимать )
Tags: Игры, программирование
Subscribe

Recent Posts from This Journal

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 6 comments