26/12/2009

Fastest Iteration

Опубликовано в: Эксперименты — Nicolas Prof @ 11:28

Небольшой наглядный тест, сравнения итераций. Очень много дискуссий в интернете по поводу, что та или иная итерация быстрее другой.
Самое интересное, что при очень большом количестве итераций (1 000 000 000), разница между различными методиками For, полностью исчезает.

Результаты теста при 1 000 000 000 итераций:

4103 ms
5340 ms
4087 ms
4089 ms
4090 ms
4090 ms

Смотреть в действии

P.S.
Постарайтесь подобрать такое количество итераций, что бы время на тип итерации выходило в районе 500мс.
На хорошем процессоре, это примерно 100 000 000 итераций.
Так же нужно понимать, что самая медленная итерация, это когда в конструкции For, i и len имеют разные типы, к примеру int и uint, про Number вообще не стоит говорить.

07/12/2009

Tips & Tricks 3

Опубликовано в: Опыт — Тэги: , — Nicolas Prof @ 22:05
  1. Papervision: При использовании 3Д на сайте, в 90% случаев необходимы 3D объекты в масштабе 1:1 к 2D объектам. В последнем проекте необходимо было сделать куб как элемент навигации, при этом текстуры на гранях не должны были масштабироваться:

    Actionscript:
    1. _camera.z = (_camera.zoom - 1) * _camera.focus + _cubeSide * 0.5;

    куб находится в нулевых координатах.

  2. Если есть XML дерево, в котором, одно и тоже XML property может присутствовать не во всех элементах дерева. И при применении фильтра:

    Actionscript:
    1. myXML..item.(@id == someID)

    вы получаете ReferenceError о том, что переменная @id не определена. Используйте другой фильтр:

    Actionscript:
    1. myXML..item.(attribute('id') == someID)

  3. При разработке сайта, на котором будет функционал требующий работы с SharedObject, приходится поверять логику работы, когда человек впервые на сайте, и не только. Самый простой способ, это удалить файл .sol. Если вы думаете, что очистка кэша в браузере поможет вам, то вы ошибаетесь. Так же вы конечно можете сделать программную кнопку, при нажатии на которую, будет происходить удаление SharedObject. Но все же, пару раз удалить файл из системы, как по мне, проще. Более подробно, где их искать в различных системах, можно почитать в Wikipedia
  4. Timer отрабатывает не сразу после вызова метода start(), а лишь через значение delay, которое вы указали в конструкторе. Что бы заставить отработать сразу, правильнее всего сделать вот так:

    Actionscript:
    1. _someTimer.dispatchEvent(new TimerEvent(TimerEvent.TIMER));
    2. _someTimer.start();

    Actionscript:
    1. this.someTimerListener(null);

    Вызвать сразу listener, плохо тем, что вы не сможете использовать updateAfterEvent

  5. Маска с поддержкой прозрачности с помощью BlendMode. Хорошая вещь, как для программистов, когда требуется создать полупрозрачную маску, и при этом контент под маской анимируется, так и для аниматоров, так как не нужно никакого кода.
    Техника очень проста:
    есть контейнер в котором все объекты, маска и содержимое, которое нужно поместить под маску. Для этого контейнера устанавливаем BlendMode.LAYER.

    Actionscript:
    1. _container.blendMode = BlendMode.LAYER;

    Все размещается по слоям. Маска обязательно находится выше содержимого. Для маски устанавливаем BlendMode.ALPHA.

    Actionscript:
    1. _gradMask.blendMode = BlendMode.ALPHA;

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

    Actionscript:
    1. _content.mask = _mask;

    В итоге, все будет выглядеть где то так:

    Actionscript:
    1. _container.addChild(_content);
    2. _container.addChild(_gradMask);
    3. _container.addChild(_mask);
    4.            
    5. _gradMask.mouseEnabled = false;
    6. _gradMask.blendMode = BlendMode.ALPHA;
    7. _container.blendMode = BlendMode.LAYER;
    8. _content.mask = _mask;

    P.S.
    Более подробно для аниматоров. Создаем Movieclip, меняем ему BlendMode на Layer, помещаем в него 3 Movieclip'a: Нижний слой - Содержимое, Средний слой - маска, делаем ее маской для содержимого, Верхний слой - полупрозрачная маска, меняем ей BlendMode на Alpha (не нужно полупрозрачную маску совать под маску, или пытаться ее тоже сделать маской).

    P.P.S.
    Если кто то всю жизнь пользовался только таким способом с помощью BlendMode, то для вас есть более простой способ, который отлично подходит для статического содержимого, к примеру текст.

    Actionscript:
    1. _mask.cacheAsBitmap = true;
    2. _content.cacheAsBitmap = true;
    3. _content.mask = _mask;

    Те же кто думал, что нужно BlendMode + cacheAsBitmap, то исправляйте код. Разве что вы могли использовать cacheAsBitmap для сложного вектора.

 

Меню:
Twitter Updates:
    Архив:
    Управление:
    Flash & Flex знакомые: