Как Adobe с похолоданием боролся
Oct. 15th, 2010 11:21 pmЕсть у них такая штука - Flex: пишешь на ActionScript3 (что-то среднее между JavaScript и C#) и MXML (аналог XAML) прыложение, а оно выполняется либо в браузере посредством Flash player'a, либо отдельно посредством AIR runtime. А еще у них есть штука под названием Pixel Bender - очередной язык для pixel shader'ов (ибо GLSL, HLSL, Cg и т.п. конечно недостаточно, нужен свой), работающий в фотошопе, After Effects, ну а теперь еще и во флэше. И вот в четвертый Flex добавили эффекты на базе этих шейдеров, чтобы переходы между разными картинками или состояниями интерфейса анимировать. Например, Wipe - где одна картинка замещается другой постепенно: когда прошло X% времени эффекта, X% площади картинки занимает новая, а остальную площадь - еще старая. Попробовал я такой эффект применить на картинке 600х400 и обнаружил, что он загрузил на 65-70% мой двухгигагерцевый двухъядерник (Core 2 Duo). Изменение частоты кадров проекта и приложения никак не повлияло: при любом заданном фреймрейте эффект оставался плавным и продолжал грузить процессор. Стал разбираться, почитал исходники (благо Flex опенсорсный) и блоги разработчиков и выяснил вот что:
1. Частота кадров эффектов жестко зашита в дебрях фреймворка и равна 100 кадрам/с.
2. Во флэше поддержка шейдеров pixel bender'a исключительно программная - никакого GPU. Ибо честная их поддержка на видеокартах сильно увеличит размер самого flash player'a, на что они пойти не готовы.
3. Зато есть JIT и распараллеливание по ядрам CPU. Сколько ядер ни дай - все загрузит ненужной работой.
4. Шейдер для Wipe выглядит так:
Другими словами, вместо того, чтобы на каждом кадре просто скопировать небольшую изменившуюся полоску картинки (x% площади, где x - доля прошедшего за один кадр времени), тут для каждой точки изображения выполняется 2-3 сравнения вещественных чисел, плюс копирование данных. Как вам такое решение?
А, и да, при каждом создании такого эффекта плеер съедает пару мегов памяти и не освобождает, пока не утечет 50 мегов.
Судя по тому, что в исходниках Flex'a упоминается одно и то же имя, и тот же человек вел видеорассказы про flex на офф.сайте, он сам это все и понаписал. До этого он работал в Sun над клиентом java (ага), а теперь в гугле работает над SDK андроида. Бойтесь.
1. Частота кадров эффектов жестко зашита в дебрях фреймворка и равна 100 кадрам/с.
2. Во флэше поддержка шейдеров pixel bender'a исключительно программная - никакого GPU. Ибо честная их поддержка на видеокартах сильно увеличит размер самого flash player'a, на что они пойти не готовы.
3. Зато есть JIT и распараллеливание по ядрам CPU. Сколько ядер ни дай - все загрузит ненужной работой.
4. Шейдер для Wipe выглядит так:
void
evaluatePixel()
{
float2 coord = outCoord();
// Use src0 in a branch we won't reach just to defeat the
// optimizer from removing the input parameter
if ((width * progress) < coord.x)
dst = sampleNearest(from, coord);
else if (progress < 100.0)
dst = sampleNearest(to, coord);
else
dst = sampleNearest(src0, coord);
// workaround for Flash filter bug that replicates last column/row
if (coord.x >= width || coord.y >= height)
dst.a = 0.0;
}Другими словами, вместо того, чтобы на каждом кадре просто скопировать небольшую изменившуюся полоску картинки (x% площади, где x - доля прошедшего за один кадр времени), тут для каждой точки изображения выполняется 2-3 сравнения вещественных чисел, плюс копирование данных. Как вам такое решение?
А, и да, при каждом создании такого эффекта плеер съедает пару мегов памяти и не освобождает, пока не утечет 50 мегов.
Судя по тому, что в исходниках Flex'a упоминается одно и то же имя, и тот же человек вел видеорассказы про flex на офф.сайте, он сам это все и понаписал. До этого он работал в Sun над клиентом java (ага), а теперь в гугле работает над SDK андроида. Бойтесь.
no subject
Date: 2010-10-16 06:11 am (UTC)И хрен с ним, с этим ускорением от видяшки, другого хватает.
no subject
Date: 2010-10-16 07:37 am (UTC)А ждать, что сами браузеры дорастут и сделают упомянутые вещи не нужными, я лично не берусь. Ибо во-первых долго ждать, во-вторых не факт, что будет работать лучше, а в-третьих разных браузеров и их версий всегда такой зоопарк, что вопросы совместимости замучают.
no subject
Date: 2010-10-16 07:46 am (UTC)А должен был?
> во-первых долго ждать,
Пока не очень надо, я жду ;-)
> во-вторых не факт, что будет работать лучше,
Хотябы проблем с совместимостью с операционными системами не будет. А то залодбало очень.
> а в-третьих разных браузеров и их версий
> всегда такой зоопарк, что вопросы совместимости замучают.
Ну, не настолько, как с тем же JavaScript 5-7 лет назад.
Сейчас уже получше, хотя и неидеально.
Есть вон Acid-тест ;-)
А вот мне, как пользователю, точно будет лучше, ибо флеш задолбал.
no subject
Date: 2010-10-16 09:41 am (UTC)А чем именно? И не задолбет ли тем же то, что придет ему на смену?
no subject
Date: 2010-10-16 11:47 am (UTC)Хотябы под 64-битными операционками работает без извратов.
no subject
Date: 2010-10-16 12:21 pm (UTC)no subject
Date: 2010-10-16 12:25 pm (UTC)Как, совсем нет? Чорт, а я-то надеялся.
Может, ну хоть каак-то можно, а?
Зачем тогда вместе с SVG делают JavaScript, если анимацию делать нельзя...
Это явный просчёт в дизайне.
А отключается оно сейчас так же, как и флеш.
no subject
Date: 2010-10-16 01:38 pm (UTC)А, ну да. Хотя как-то оно хлипко и низкоуровнево выглядит.
no subject
Date: 2010-10-16 01:41 pm (UTC)JavaScript'ом, ну не сказать, что особо низкоуровнево. Обыкновенно.
Так же, как и с HTML - есть объекты, есть события типаа OnMouse*.
Всё обычно.
no subject
Date: 2010-10-16 09:56 am (UTC)