По мотивам поста сделал и распечатал себе картинку.
Похожая со свойствами TweenLite висит у меня в офисе. Новичкам будет уж точно очень полезно.
Making things move since 1999.
По мотивам поста сделал и распечатал себе картинку.
Похожая со свойствами TweenLite висит у меня в офисе. Новичкам будет уж точно очень полезно.
Последние пару дней я посвятил некоторым тестам производительности, о чем писал, например, тут.
И вот сегодня Grant Skinner публикует отличнейший материал. Многого не знал. Рекомендую всем AS3 разработчикам!
Как выяснилось, AS3 компилятор необычайно туп и не проводит никаких оптимизаций. Ну, может быть какие-то совсем простые.
Довелось мне посидеть оптимизировать небольшую библиотечку, на которой стоят все мои остальные. В ней происходит разбор XML, да через e4x, но все же разбор и создание некоторых объектов на основе этого XML. При этом, проходят некоторые проверки функциями isЧто-то(XML), которые представляют собой всего 1-3 строчки. Вызываются такие функции для каждого элемента, то есть часто.
А теперь смотрим тест.
var t: int;
var v: int = 5;
var w: int = 6;
for ( var i: int = 0; i < 5; i++ )
{
t = getTimer();
for ( var j: int = 0; j < 1000000; j++ )
{
var k: Boolean = func( v, w );
//var k: Boolean = v > w;
}
trace( getTimer() - t );
}
private function func( v: int, w: int ): Boolean
{
return v > w;
}
Выполняется у меня под 400ms.
Если раскомментировать вторую строку и закомментировать первую, то время падает до 90-100ms. В 4 раза. Полмиллисекунды тут, полмиллисекунды там и уже набираются десятки. Вспомним, что при 30fps на 1 кадры выделяется 33 миллисекунды. А ведь еще столько кода нужно выполнить.
Более того,
var t: int;
for ( var i: int = 0; i < 5; i++ )
{
t = getTimer();
for ( var j: int = 0; j < 1000000; j++ )
{
var k: int = value;
//var k: int = _value;
}
trace( getTimer() - t );
}
public function get value(): int
{
return _value;
}
та же фигня. Геттер по сути та же функция с теми же проблемами.
Я пошел и заменил все вызовы этих функций на сами функции. Любой программист знакомый с ООП сочтет меня дураком, потому что я копирую код. Пойдет на форум и напишет какой я тупой и не знаю ООП. Запихнет все эти скопированные куски в функции и будет горд собой. Вот он и вопрос. Скорость или ООП? По крайней мере пока компилятор остается таким говнистым, что сам не соображает как лучше сделать.
Как по-вашему должен работать флэш компонент с неправильными входными данными? Неправильно он должен работать, мать вашу, неправильно! Тут спрашивают “А как же защита от дурака?”, данные подаются моими соратниками по работе. Наверно, все они дураки а мне пора увольняться. Я еще должен тратить столько же времени на то, чтобы сделать дуракоустойчивость от своих же напарников?
Приходит мне гневное письмо, что мол BUFFERING ISSUE. Чозанах? Висит плеер на buffering, то есть метедата не получено еще от видео файла. И так оно висит минуту пока файл не загрузился до конца, потому что метадата В КОНЦЕ. Кто-то додумался пихнуть такое видео и не проверить. В итоге я виноват, что клиент ничего не увидел, потому что минуту не ждал, пока загрузится.
И подобная фигня постоянно и везде.
Красота растений привлекала внимание математиков веками. Активнее всего изучались интересные геометрические свойства растений, такие как симметрия листьев относительно центральной оси, радиальная симметрия цветов, и спиральное расположение семечек в шишках. “Красота связана с симметрией” (H. Weyl. Symmetry). Во время роста живых организмов, особенно растений, можно четко видеть регулярно повторяющиеся многоклеточные структуры. В случае составных листьев, например, маленькие листочки, которые являются частью большого взрослого листа, имеют ту же форму, что весь лист имел на раннем этапе формирования. [1]
В 1968г. Венгерский биолог и ботаник Аристид Линденмайер (Aristid Lindenmayer) предложил математическую модель для изучения развития простых многоклеточных организмов, которая позже была расширена и используется для моделирования сложных ветвящихся структур — разнообразных деревьев и цветов. Эта модель получила название Lindenmayer System, или просто L-System.
Для тех, кто в теме и не хочет все читать целиком, проскрольте вниз, есть вопрос.
Я буду сокращать L-System до L в тексте.
Основная идея L — постоянная перезапись (rewriting) элементов строки. О чем это? Вкратце, rewriting — это способ получения сложных объектов путем замены частей простого начального объекта по некоторым правилам. Классическим примером является снежинка. На рисунке initiator — это начальный объект, грани которого заменяются на generator. Далее с новым объектом проделывается то же самое. В данном случае обычный фрактал.

Возвращаясь к L и проводя аналогию с фракталами, можно сказать, что L оперирует со строкой символов по специальным правилам, начиная с первоначальной простой аксиомы. Люди, знакомые с понятием грамматики, сразу заметят, что по сути L ей и является. Но фундаментальное отличие L от формальных грамматик состоит в том, что правила применяются одновременно ко всей строке, к каждому символу, плюс, нет понятий терминальных и нетерминальных символов. То есть “вывод” по этой грамматике может продолжаться бесконечно. Одновременность применения правил очень быстро становится понятна, если учесть откуда пришла эта модель. В биологии каждая клетка растет, делится и развивается параллельно во времени. На следующей картинке видно соотношение между контекстносвободными (OL), контекстнозависимыми (IL) L и другими формальными грамматиками в иерархии Хомского.

Также, как и в классификации Хомского, L имеют и свою классификацию от простых до сложных и мощных.
Самым простым примером являются детерминированные контекстносвободные L или сокращенно DOL. Я не люблю формальные определения грамматик, так что скажу просто своими словами. Есть некоторый набор символов — алфавит. Этим алфавитом записывается строка, с которой работает L. Есть аксиома — первоначальная строка из одной или более буквы и набор правил вида a → ab. Во время каждой итерации алгоритма, применяя правило к букве из текущей строки, она (буква) заменяется на набор букв справа от стрелки. Проще рассмотреть конкретный пример развития многоклеточного организма Anabaena catenula, который изучал Линденмайер, когда он предложил модель L.
Пусть наш алфавит состоит из следующих символов, каждый из которых обозначает некоторую клетку: al ar bl br.
Аксиома состоит из одного символа.
ω : ar
И 4 правила.
p1 : ar → albr
p2 : al → blar
p3 : br → ar
p4 : bl → al
Правила говорят какие символы меняются на какие в процессе роста организма. На картинке видно как применяя правила мы наблюдаем “деление” клеток и развитие.

Пока мы видели как нарисовать одномерную бактерию, но с помощью известного детского языка программирования LOGO, в котором предлагается управлять черепашкой и рисовать фигуры на экране, можно будет уже рисовать двумерные и трехмерные фракталы и повторяющиеся структуры. Как? Все просто. Берем алфавит, в котором каждый символ означает некоторую команду для двумерной или трехмерной черепашки:
Эти команды используют дефолтные значения угла поворота δ, длины шага и базисные векторы двумерного и трехмерного пространства. Примеры двумерных фракталов и порождающих их L можно увидеть на следующей картинке.

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

Разумеется, наука не стояла на месте, и сейчас мы имеем солидную иерархию L начиная с простых DOL рассмотренных ранее.
Стохастические L.
Стохастические L добавляют возможность задания вероятности выполнения того или иного правила, и в общем случае не являются детерминированными, ибо разные правила могут иметь один и тот же символ слева. Это вносит некоторый элемент случайности в получающиеся структуры.
Контекстнозависимые L.
Также, как и контекстнозависимость в формальных граматиках, в L синтаксис правил усложняется и принимает во внимание окружение заменяемого символа.
Парамметрические L.
К каждому символу добавляется параметр-переменная (возможно не одна), которая позволяет, например указывать величину угла поворота для + и -, длину шага и толщину линии, проверять условия для применения правила, считать количество итераций и передавать “сигналы” вперед и назад. Пример парамметрической L.
ω : B(2)A(4, 4)
p1 : A(x, y) :y <= 3 → A(x ∗ 2, x + y)
p2 : A(x, y) :y > 3 → B(x)A(x/y, 0)
p3 : B(x) :x < 1 → C
p4 : B(x) :x >= 1 → B(x − 1)
Парамметрические контекстнозависимые L позволяют моделировать рост многоклеточных организмов и растений с учетом биохимических процессов и окружающей среды. Например, наша старая знакомая Anabaena catenula в более сложной форме. Пример из книжки [1].
Как написано в книге, данная бактерия состоит из двух видов клеток: вегетативные клетки и гетероцисты. Обычно, вегетативные клетки делятся на две подобные вегетативные клетки. Однако, в некоторых случаях вегетативные клетки превращаются в гетероцистов. Их распределение следует хорошо наблюдаемому шаблону, в котором соседние гетероцисты разделены примерно одинаковым числом вегетативных клеток. Но как же организм поддерживает постоянное расстояние между гетероцистами во время роста? Предложенная модель описывает этот феномен с точки зрения биологии. Предполагается, что расположение гетероцистов регулируется соединениями азота, производимые этими клетками, которые передаются в другие клетки организма и потребляются в вегетативных клетках. Если содержание этих соединений в молодй вегетативной клетке падает ниже определенного уровня, эта клетка превращается в гетероцист.
L-System ниже моделирует рост бактерии с учетом вышесказанного.
#define присваивает значения константам используемым в L.
#include загружает форму гетероциста, в данном случае круг.
Клетки представлены модулем F(s, t, c), где s — длина клетки, t — тип клетки (0 — гетероцист, 1 и 2 — вегетативные клетки), а c — концентрация азота.
#define CH 900 /* high concentration */
#define CT 0.4 /* concentration threshold */
#define ST 3.9 /* segment size threshold */
#include H /* heterocyst shape specification */
#ignore f ∼ H
ω : -(90)F(0,0,CH)F(4,1,CH)F(0,0,CH)
p1 : F(s,t,c) : t=1 & s>=6 → F(s/3*2,2,c)f(1)F(s/3,1,c)
p2 : F(s,t,c) : t=2 & s>=6 → F(s/3,2,c)f(1)F(s/3*2,1,c)
p3 : F(h,i,k) < F(s,t,c) > F(o,p,r) : s>ST|c>CT → F(s+.1,t,c+0.25*(k+r-3*c))
p4 : F(h,i,k) < F(s,t,c) > F(o,p,r) : !(s>ST|c>CT) → F(0,0,CH) ∼ H(1)
p5 : H(s) : s<3 → H(s*1.1)

Вот, например, недавняя гипножаба, покорившая интернет, по сути является комбинацией простейших L.

#define R 1.456
ω : A(1)
p1 : A(s) → F(s)[+A(s/R)][−A(s/R)]
Это всего лишь поверхностное описание теории и небольшие примеры применения на практике. Что ждет любопытного исследователя дальше?




Еще в конце 80х L использовались для визуализации моделей растений. Сейчас возможности компьютеров ушли далеко вперед. Многие игры и инструменты 3d моделирования используют процедурную генерацию контента, в том числе и L-Systems. Как видите, из набора простых правил можно получить огромное количество разных растений и засадить ими целые поля.
Из редакторов я сам пользуюсь L в Houdini, слышал, что есть плагины и для других пакетов. Так называемая Виртуальная Лаборатория позволяет экспериментировать и анимировать L.
Методы использования грамматик также используются в так называемых Shape Grammars, но об этом потом.
Вообще говоря, единственная доступная книга — это The Algorithmic Beauty of Plants. Также, по интернету разбросаны старые рандомные статьи. Более-менее новые можно найти на springerlink.com за кучу денег или в институтской библиотеке забесплатно.
Что сказать, материала довольно маловато.
Я сам имею ровно никакое отношение к биологии, а являюсь Магистром Математики с небольшими невиными увлечениями. Но мне чрезвычайно нравится идея L-Systems. Простота с огромными возможностями. Когда-то давно я задумывался как же так в ДНК содержится полная информация обо мне. Как же можно в каждую клетку впихнуть всю информацию обо всех клетках? А никак, можно сказать, теория L открыла мне глаза! У меня в ДНК написано не как я выгляжу, а как меня собрать (общими словами). Что-то похожее на набор правил в L, только относящееся к синтезу протеинов.
Простая модель так четко описывает нашу с вами жизнь.
Дальше больше — превращаем правила в "ДНК" и генетическим алгоритмом выращиваем виртуальных многоклеточных.
Мне бы хотелось найти людей, которые тоже заинтересованы в научной составляющей L, поделиться материалами и статьями. Так уж получилось, что я сейчас работаю над апгрейженной концепцией L-Systems, но не имею возможности просмотреть что писалось по этой теме за последние пять лет. Не хочется изобретать велосипед.
Связаться с автором КНИГИ не удалось, автоответчик говорит, что он уехал на шабаш до января (8
Также, я ищу информацию по Shape Grammars для 3d моделирования. Есть задача генерировать из параметров космические корабли, ну знаете такие огромные штуковины с кучей мелких деталей — идеальные кандидаты для SG. Неужели придется писать плагин для Houdini на Python?
Мне, как флэш разработчику, часто приходится “оживлять” во флэш сайты задумки разных дизайнеров. Если дизайн убог, у меня нет мотивации делать из него флэш конфетку, о чем я сразу говорю заказчику/начальнику (не то, что мне лень делать хороший сайт, а то что дизайн УГ и сайт получится соответственно еще большим УГ). И вот мне прислали дизайн, который вроде бы красивый, все ссутся от радости, но что-то в нем не то…
Это не дизайн, это PSD документ. Какой-то компот из двумерных слоев с тенями, большинство из которых в природе впринципе быть не может. Почему такие тени? Где источник света? Включенная лампочка такие тени точно не отбрасывает. Этот холодильник 3 дюйма в глубину? Почему все объекты параллельны камере? Некоторые элементы просто отражения одного и того же. Бутылка приклеена к стене? Такие провода тупо быть не могут.
Получился какой-то PSD файл претендующий быть живой трехмерной комнатой. Но тут нет совершенно никакой жизни.
Это я зануда, да?
Большинство из нас подписано на множество блогов и иных ресурсов разной тематики. Само по себе постоянное чтение всякой фигни вместо того, чтобы работать как минимум вызывает недовольство начальника. Проверка каждые три с половиной минуты а не появилось ли чего нового где-то в интернетах говорит либо об увлекательности (а вернее ее отсутствии) текущей работы, либо о прогрессирующей вредной привычке. Тем не менее, даже быстрый просмотр содержания RSS за последние пару часов упорной работы во время перерыва порой вызывает скрытый гнев некоторых сотрудников.
Так все же, RSS это вселенское зло? Не совсем, из своего личного опыта, напишу почему.
Я не буду говорить (хотя что там, я же уже написал это), что RSS как минимум избавляет меня от проверки сотни блогов вручную, а ведь я помню время, когда это и был единственный способ получения информации. Речь не об этом.
Помните, в детстве родители заставляли читать книжки? Воображение там развивает и все дела. Всё, детство кончилось, книжки остались только издательства O’Reilly, а читают сейчас блоги. Какой практический смысл в книжках? Книги — это пища для ума, не иначе. Известно, что при многократном повторении некоторых действий, эти действия «записываются» в мозге и достаются из памяти легче, быстрее и часто автоматически. При однократном действии, например прочтении книги, вы вряд ли через какое-то время сможете вспомнить некоторые детали, но идеи, которые автор пытался до вас донести, останутся в памяти на долго, и очень вероятно будут использованы позже в творческой деятельности. Вот где развитие воображения.
С современными блогами можно провести аналогию к книгам. Вы читаете небольшую статью, в которой автор пытается донести до вас некоторую идею или поделиться жизненным опытом. Опыт и идея могут быть полезными и бесполезными, полезные блоги со временем начинают читать бОльшее количество людей, бесполезные никому не нужны, их никто не читает, а автор имеет невинное бесполезное занятие и не ходит по ночам поджигать бомжей — тоже вполне себе польза.
Блоги — это источник информации на любую тему, 98% которой вам прямо сейчас не нужна. А чтение ненужной информации вполне выглядит как ненужное действие. Но, позвольте привести несколько примеров из жизни. Я на своем опыте убедился, что от этой вроде бы не нужной информации вполне есть ощутимая польза в ближайшем будущем.
* С человеком с разносторонними интересами приятно найти общие темы для разговора, сколько раз меня выручало от тупого неуютного молчания то, что несколько дней назад я читал вроде бы ненужную статью по той или иной теме.
* Порой только зная, что что-то теоретически существует, можно сильно облегчить себе жизнь. Примеров масса, в основном в IT. Вы не представляете как часто приходится кидаться линками на блог посты в особо ярых велосипедоизобретателей.
* Чужой опыт может понадобиться тебе. Например, столкнувшись с очередным косяком IDE по работе, я вспомнил, что что-то такое я где-то видел уже. И да, нужная статья с рецептом решения проблемы была быстренько найдена.
* Чужой негативный (порой с фатальным исходом) опыт тоже всплывет в памяти, чтобы предостеречь как чего-то делать не стОит. Пример был только недавно, когда я чуть не попался на развод, о котором где-то читал в контексте многочисленных убийств некой бандой.
* Наконец, даже баянами с башорга можно развлечь не особо активных интернет юзеров.
В разных фирмах поразному относятся к «трате времени на блоги», вместо того, чтобы работать. Понятно, что сотрудник, который не делает ровным счетом ничего, кроме постоянного рефреша RSS ридера, явный кандидат на увольнение. Но порой доходят до крайности запрещая вообще все вокруг (запретить вконтакте я за). Но, мне как минимум нужны перерывы в упорной работе (да, я частенько упорно работаю), и я не курю. Так что не могу каждые 15 минут выходить в корридор и проводить там следующие 15 минут ничего не делая.
И да, сейчас у меня перерыв и я пишу эту статью.
Если весь пост выглядит как оправдание блого-addiction, то мне наверно пора уже лечиться от этой зависимости, а текст является ничем иным как попыткой наркомана оправдаться прежде всего перед собой.
Двудневная деловая поездка в Москву прошла весьма удачно. Было выполнено 6 задач из запланированных 7ми. Поставлены некоторые чекпоинты и дедлайны моей дальнейшей профессиональной деятельностью.
Ну и, хорошо посидели конечно, хоть и не так долго.