пятница, 17 апреля 2009 г.

Скрытое влияние на производительность "фигурных" окон

Это перевод A hidden performance cost of regional windows. Автор: Реймонд Чен.

Фигурные окна (т.е. окна, полученные с помощью регионов; regional windows) довольно приятны, но это не достаётся за бесплатно. Большинство расходов вы можете видеть явно. Например, постоянное изменение региона очевидно создаёт нагрузку, потому что вы должны сидеть и постоянного создавать новые регионы.

Один из вопросов, который возникает для внутренней производительности, подчеркивает один из скрытых расходов на фигурные окна: предполагаемый прямоугольник окна.

Предположим, что у вас есть большое окно, но для него установлен маленький регион. Насколько это хуже, чем если было бы маленькое окно с маленьким регионом?

На самом деле, довольно значительно.

Проверка на входимость (hit-testing) - это одна из самых часто выполняемых оконным менеджером операций. По заданной точке на экране нужно найти окно, которому она соответствует. Чтобы ускорить этот процесс, для быстрого отсекания окон используются прямоугольники окон. Например, если прямоугольник окна будет иметь координаты (0,0)-(100,100), то тогда точка (200,10) лежит, очевидно, вне окна, т.к. её координаты не вписываются в прямоугольник. Такие проверки с прямоугольниками очень быстры.

Если же окно использует регион, тогда теста только прямоугольников недостаточно, потому что точка может принадлежать прямоугольнику, но при этом лежать вне региона. В этом случае, точка должа быть протестирована с самим регионом.

Но Windows использует оконный прямоугольник для быстрого теста, чтобы отсеять ненужные окна и убедиться, что необходимо проверять именно регион. Если точка лежит вне прямоугольника, тогда менеджер окон не будет беспокоиться о проверках региона. Это хорошо, потому что проверки принадлежности точки региону относительно медленны.

Другими словами, псевдо-код для hit-testing делает примерно следующее:
  if точка лежит вне прямоугольника окна then
Result := нет-вхождения
else
if у окна нет региона then
Result := вхождение
else
if точка лежит внутри региона then
Result := вхождение
else
Result := нет-вхождения;
Так что, если вы создадите огромное окно с крошечным регионом, менеджер окон не сможет применять (быстрый) тест прямоугольников. Ему придётся пойти по третьей ветке - (медленной) проверке региона.

Мораль истории: когда вы используете регионы в окнах, создавайте окна размером с описанный прямоугольник (bounding box) своего региона. Это поможет оконному менеджеру лучше выполнять свою работу.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.