понедельник, 17 марта 2008 г.

Flash/Flex CS3 fast loops

Протестировал скорость работы циклов и массивов во флексе.
Результаты интересные:

  1. Тип переменной цикла int или uint не играет роли для скорости самого цикла (точнее цикл по int быстрее цикла по uint на 0,9%);
  2. Обращения к массиву по индексу uint быстрее индекса int на 3%;
  3. Скорость цикла по int с преобразованием к индексу массива uint такая же, как если сразу завести цикл по uint и обращаться к массиву по индексу uint. (т.е. выиграть за счет п.1 не удается);
  4. При работе с массивом, циклы работающие с конца (i--), тормознее циклов работающих с начала (i++) на 3,7%;
  5. Попытки типизировать массив [ArrayElementType("Number")] ничего не дают. Эта фича не работает вообще вне Flex Builder;
  6. Объявление длины обрабатываемого массива как var то же, что и const;
  7. Переменную цикла можно объявить как const! Но никакой разницы с var нет;
  8. Локальность/глобальность обрабатываемого массива безразлична;
  9. Выносить вычисление размера массива из цикла действительно необходимо. Очень большие потери в скорости, например в 40%;
  10. Циклы while и for по скорости друг от друга не отличаются.
Итого, самый быстрый (и безопасный) цикл по массиву выглядит так:
const len: uint = Arr.length;
for (var i: uint = 0; i < len; i++) {
  Arr[i] = ...
}
...или так...
const len: uint = Arr.length;
var i: uint = 0;
while (uint(i++) < len) {
  a[i] = ...
}

вторник, 4 марта 2008 г.

Nice Rounded Corners for IE, Safari, Firefox

Некоторое время я посвятил теме скругления углов у блочных элементов. Вот что получилось.

Цель
Разработать самый лучший (простой и надежный) метод для скругления углов у блочных элементов.

Требования
Необходимо достигнуть баланса со следующим списком требований:
  1. Никаких изображений. В крайнем случае — одно.
  2. Никакого яваскрипта. Должно работать без него. В крайнем случае — только expressions для IE. Т.е. случай с отключенным яваскриптом в IE принимаем за маргинальный.
  3. Работать должно во всех более-менее заметных браузерах и мобильных устройствах: IE 7, 6, 5.5; Firefox 2, 1.5; Safari 3, 2; Opera 9.5, 9, 8. В крайнем случае — только на наиболее популярных — IE 7,6; Firefox 2; Safari 3
  4. Визуальная привлекательность. Максимально быстрая отрисовка прямо со старта — именно поэтому никаких изображений и скриптов. Уж больно эти загружающиеся изображения и прочие тормоза раздражают.
  5. Валидность XHTML Strict 1.0 по нормам валидатора W3C и работа с content-type. "application/xhtml+xml" для всех кроме IE и c "text/html" для IE
  6. Расширяемость на будущее. Чтобы при появлениии новых версий браузеров это не сломалось.
  7. Валидность CSS 2 и отсутствие хаков в CSS. Это, пожалуй, недостижимо, но к этому нужно стремиться.
  8. Семантичность верстки. Никаких лишних сущностей в html-коде быть не должно. В крайнем случае — должен быть семантичный DOM.
  9. Оптимизация производительности. Главное — минимизация числа запросов к серверу. На следующем месте — минимизация трафика.
  10. Гибкая верстка. При изменении размера блока, масштаба страницы, размера шрифта, ничего разъезжаться не должно.
Анализ существующих методов
  1. Картинки в углы. Тормоза, лишние запросы. Несемантичный код или семантичный, но требуется включенный JS в IE.
  2. Буллеты в углы. Проблемы с масштабированием. Проблемы с читалками экрана.
  3. Эмуляция пикселов в углах через сетку html-тегов. Несемантичный код. Раздувание кода и стилей.
  4. Встроенные средства браузеров. Хорошо, но неуниверсально. CSS3 еще никто не поддерживает.
  5. SVG как фоновое изображение. Это безусловно будет хит. Но поддерживается пока только оперой 9.5 beta.
Процесс
В общем, как можно заметить, хороших способов нет. Точнее, их будет аж два: SVG как фоновое изображение и средства предлагаемые CSS3. Но это для культурных браузеров. А вот для IE ничего нет и не предвидится. И тут меня осенило: У IE начиная с версии 5.5 есть полный аналог SVG. Это VML!
Итак, после некоторых раздумий было решено: использовать VML для IE, а в остальных случаях использовать аналоги из CSS3.

Результат

Для работы с VML нужно вначале включить namespace для VML. Например так:  Потом нужно включить сам VML (в стилях). Например так: v\: * { behavior: url(#default#VML); } После чего можно использовать команды VML прямо в тексте.

Разные замечания:
  1. Можно ещё улучшить — подключить SVG, тогда заработает и в опере 9.5 и в других будущих продвинутых браузерах.
  2. Обратите внимание на условные комментарии для IE. Оказывается многие не знают как сделать "else".
  3. Комментарии можно вообще убрать. И использовать тег "v:roundrect" как блочный элемент (заодно и код будет семантичен). Я проверял — работает во всех браузерах. Можно даже content-type выставить в application/xhtml+xml. Но возмущается валидатор W3C. Можно дополнить DTD. Но это не понимает IE. Можно создать свой DTD. Но валидатор от W3C не понимает custom DTD. В общем, решайте сами, что вам валидней. Как по мне, так в данном конкретном случае валидатор от W3C конкретно не прав. Ну да ладно.
  4. Насчет оперы. Я очень люблю этот браузер. В том числе это означает и то, что я прощаю ему то, чего он не умеет. Он очень быстро развивается. Так что это не проблема.
  5. Я не в восторге от смешивания HTML и VML, но другого способа подсоединить VML нет.
  6. Те атрибуты VML-тегов, которые относятся только к VML нельзя переместить в стили. Увы.
  7. Если использовать VML-теги как блочные элементы, то они не понимают margin. Padding понимают. Есть и ещё мелкие странности. Типа отступов в 1px в некоторых случаях.
  8. Кривые в VML сглаживаются! Это выглядит просто отлично.
  9. Что делать с градиентами? VML и SVG их поддерживают. Можно и реализовать.
  10. Интересный случай — код в примере не семантичен, но построенный по нему DOM — да.
Итак, решение работает во всем чем только можно, исключая оперу. Лишних запросов нет вообще. Почти семантично. Отображается моментально. Красота. 

Цель достигнута. Интересно только почему никто ранее не додумался до этого?