пятница, октября 17, 2008
FlexMonkey - тестирование UI
FlexMonkey - это фреймворк, автоматизирующий тестирование функциональности пользовательского интерфейса Flex-приложений. С его помощью можно записывать и воспроизводить взаимодействия с UI приложения. Также можно генерировать ActionScript-код с тестами. Использует Flex Automation API. Вот небольшой пример.
среда, октября 15, 2008
Adobe FlexTeam будут в Москве
Совершенно случайно узнал о том, что во второй половине октября FlexTeam будут в Москве на следующих мероприятиях:
- The 4th Software Engineering Conference (Russia) 2008 SEC(R) 2008 (Enrique Duvos).
- Russian Internet Week - http://www.riw2008.ru/program/
- User Experience Conference (Serge Jespers)
- Russian Flex User Group (30 октября) - тоже обещали заехать.
среда, сентября 17, 2008
Unit-тесты в ActionScript
Недавно заинтересовался созданием тестов в процессе разработки. На тот момент я знал только одну тулзу для создания unit-тестов - это FlexUnit, который переехал под крыло Adobe. Немного поискав, я открыл для себя fluint. Fluint поддерживает
А кто еще что-нибудь использует и как относится к тестированию в процессе разработки?
- множественные асинхронные операции;
- поддержку setup и teardown для задания каких-то начальных параметров и их очистки;
- поддержку тестирования UIComponent;
- поддержку тестирования команд и контроллеров Cairngorm;
- вывод результатов в виде XML;
- поддержку тестов в модулях.
А кто еще что-нибудь использует и как относится к тестированию в процессе разработки?
пятница, сентября 12, 2008
напоминание != remember
Кто интересно локализовывал 10 плеер для русского языка? В контекстном меню плеера в разделе разрешения использования микрофона есть 2 пункта - разрешить и запретить, а внизу галка Remember, то есть запомнить и в следующий раз не спрашивать, а на русский перевели как Напоминание, то есть получается надо напоминать каждый раз, если галка отмечена?
среда, августа 20, 2008
Обновление класса Filereference в 10 плеере
В новой десятке класс Filereference стал более "безопасным". Теперь метод FileReference.browse() нельзя будет вызвать программно, а только в ответ на нажатие клавиатуры или мыши. В связи с этим возникнет необходимость переделывать флешовые аплоадеры для Flickr, SWFUpload и Wordpress.
Как говорят в Adobe, данная мера вызвана необходимостью повышения безопасности - якобы пользователя может ввести в заблуждение внезапно появившееся окошко и он случайно сохранит не то, что нужно:)
Источник
Как говорят в Adobe, данная мера вызвана необходимостью повышения безопасности - якобы пользователя может ввести в заблуждение внезапно появившееся окошко и он случайно сохранит не то, что нужно:)
Источник
Во Flash-видео скоро появится новый тип метаданных
В скором времени Adobe Systems представит на обозрение новую фичу видео - voice-to-text. Это означает, что вся произносимая речь будет переведена в метаданные и внедрена в видео-ролик с помощью средств для редактирование видео от Adobe. Внедрение данной разработки окажет огромное влияние на индексацию видео-контента и видео-рекламу.
Jim Guerard, заведующий всем rich media в Adobe, говорит, что данный функционал мы сможем увидеть уже в этом году.
Jim Guerard, заведующий всем rich media в Adobe, говорит, что данный функционал мы сможем увидеть уже в этом году.
четверг, августа 14, 2008
Откуда у функции length?
На днях столкнулся с такой проблемой.
После переноса цикла в функцию, в последней остался параметр length, который был локально обозначен перед циклом и был успешно там забыт. Но ошибки компилятор не выдал и косяк не был замечен сразу. Потом я обратил внимание на этот загадочный length.
Откуда же он взялся?
А взялся он от функции и равен количеству аргументов, заданных в сигнатуре функции. Он отличается от arguments.length тем, что arguments.length равен реально переданному количеству аргументов. Например, если компилировать в standard mode:
После переноса цикла в функцию, в последней остался параметр length, который был локально обозначен перед циклом и был успешно там забыт. Но ошибки компилятор не выдал и косяк не был замечен сразу. Потом я обратил внимание на этот загадочный length.
Откуда же он взялся?
А взялся он от функции и равен количеству аргументов, заданных в сигнатуре функции. Он отличается от arguments.length тем, что arguments.length равен реально переданному количеству аргументов. Например, если компилировать в standard mode:
function traceLength(x:uint, y:uint):void
{
trace("получено: " + arguments.length);
trace("ожидалось: " + traceLength.length); // или просто length
}
traceLength(3, 5, 7, 11);
/* output:
получено: 4
ожидалось: 2 */
Ссылка на доку
пятница, августа 01, 2008
Поддержка AMF cкоро будет в Zend Framework
Так называемый Zend_Amf_Server обеспечит поддержку формата AMF для Zend Framework. Участвовать в проекте будет Wade Arnold - человек, ведущий проект AMFPHP. Надеюсь эта новость оправдает тормоза в релизах AMFPHP, который завис на бете в сентябре 2007 года.
среда, июля 30, 2008
14 июля начато строительство моста ...
...между Adobe Air и Java под названием Merapi.
Merapi - это фреймворк, объединяющий оба типа приложений, запущенных на десктопе и выступающий так называемым мостом между ними. Взаимодействие реализовано с помощью класса merapi.Bridge, реализованного как для Air, так и для Java. С помощью Merapi Air-приложение может выступать интерфейсом к Java-приложению, что позволит расширить возможности приложения до бесконечности. В общем, кому интересно - добро пожаловать на сайт проекта.
Merapi - это фреймворк, объединяющий оба типа приложений, запущенных на десктопе и выступающий так называемым мостом между ними. Взаимодействие реализовано с помощью класса merapi.Bridge, реализованного как для Air, так и для Java. С помощью Merapi Air-приложение может выступать интерфейсом к Java-приложению, что позволит расширить возможности приложения до бесконечности. В общем, кому интересно - добро пожаловать на сайт проекта.
вторник, июня 10, 2008
Small Worlds
Никогда особо не интересовался всякими онлайн-играми, но недавно пришло приглашение в бета-версию игры Small Worlds и, зарегистрировавшись там, я был мягко говоря поражен ее крутотой.
SmallWorlds - это виртуальный 3D мир, который создается самими игроками. Это флексовый проект, созданный студией Outsmart из Новой Зеландии. С серверной стороны используется Java. Также используется вебсервис Amazon’а Elastic Compute Cloud, также известный как EC2. Этот виртуальный сервер позволяет SmallWorlds масштабироваться на 1000 серверов в считанные минуты.
Пользователи могут создавать своих героев. Причем опций для настройки очень много и есть вероятность при желании повторить себя в виртуальном мире:)

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

В процессе игры вы можете посещать квартиры других участников, различные публичные места, магазины, клубы и т.п. При желании можно общаться с другими игроками, играть в игры (я успел выиграть в шашки), пинать чужих собак, заводить себе друзей и еще много всего. В магазинах можно делать различные покупки, например, мебель, которой потом обставлять свое жилище на свой вкус.

В планах на будущее:
В общем лучше один раз увидеть, как говорится.
SmallWorlds - это виртуальный 3D мир, который создается самими игроками. Это флексовый проект, созданный студией Outsmart из Новой Зеландии. С серверной стороны используется Java. Также используется вебсервис Amazon’а Elastic Compute Cloud, также известный как EC2. Этот виртуальный сервер позволяет SmallWorlds масштабироваться на 1000 серверов в считанные минуты.
Пользователи могут создавать своих героев. Причем опций для настройки очень много и есть вероятность при желании повторить себя в виртуальном мире:)

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

В процессе игры вы можете посещать квартиры других участников, различные публичные места, магазины, клубы и т.п. При желании можно общаться с другими игроками, играть в игры (я успел выиграть в шашки), пинать чужих собак, заводить себе друзей и еще много всего. В магазинах можно делать различные покупки, например, мебель, которой потом обставлять свое жилище на свой вкус.

В планах на будущее:
- куча опций для аватаров
- API для Flash разработчиков
- множество игр
- виджеты
В общем лучше один раз увидеть, как говорится.
пятница, июня 06, 2008
Один ItemRenderer для нескольких колонок
Столкнулся с задачей отображения в DataGrid одинаковых по сути данных (UNIX_TIMESTAMP), к которым нужно применить ItemRenderer так, чтобы последний знал к какой колонке он применяется. Я нашел два способа это сделать и оба связаны с использованием свойства listData. Свойство listData имеют такие элементы как Text, Label, Button, CheckBox и т.п., то есть те, которые имплементируют интерфейс IDropInListItemRenderer. В данном случае в качестве ItemRenderer мне достаточно использовать Label. Если же необходим какой-нибудь контейнер в качестве рендерера, который не имеет свойства listData по-умолчанию, его необходимо реализовать своими силами.
Итак, первый способ - это назначать данные для рендерера в зависимости от индекса колонки таблицы. Приведу кусок кода:
Здесь мы обращаемся к listData, кастим его к DataGridListData, получаем индекс колонки таблицы и в зависимости от индекса отображаем в колонках date1 или date2. Недостатком этого способа является то, что при добавлении новых колонок перед этими придется переделывать код рендерера и также нельзя перетаскивать колонки. Поэтому рассмотрим второй способ.
В данном случае мы обращаемся не к columnIndex, а к dataField, таким образом получая строку, в которой содержится название поля, из которого мы получаем данные. А с помощью data[myListData.dataField] мы получаем значение этого поля.
Итак, первый способ - это назначать данные для рендерера в зависимости от индекса колонки таблицы. Приведу кусок кода:
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
...
override public function set data(value:Object):void
{
super.data = value;
var myListData:DataGridListData = DataGridListData(listData);
var colIndex:int = myListData.columnIndex;
switch (colIndex)
case 1: text = data.date1; break;
case 2: text = data.date2; break;
}
...
</mx:Label>
Здесь мы обращаемся к listData, кастим его к DataGridListData, получаем индекс колонки таблицы и в зависимости от индекса отображаем в колонках date1 или date2. Недостатком этого способа является то, что при добавлении новых колонок перед этими придется переделывать код рендерера и также нельзя перетаскивать колонки. Поэтому рассмотрим второй способ.
<?xml version="1.0" encoding="utf-8"?>
<mx:Label xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.controls.dataGridClasses.DataGridListData;
[Bindable] private var formattedVal:String;
override public function set data(value:Object):void
{
super.data = value;
if (value)
{
var myListData:DataGridListData = DataGridListData(listData);
var dt:Date = new Date();
var cellVal:int = int(data[myListData.dataField]);
dt.time = cellVal*1000;
formattedVal = dateformatter.format(dt);
}
}
]]>
</mx:Script>
<mx:DateFormatter id="dateformatter" formatString="DD.MM.YY J:NN"/>
<mx:text>{formattedVal}</mx:text>
</mx:Label>
В данном случае мы обращаемся не к columnIndex, а к dataField, таким образом получая строку, в которой содержится название поля, из которого мы получаем данные. А с помощью data[myListData.dataField] мы получаем значение этого поля.
пятница, мая 30, 2008
Пример динамического наложения двух mp3
Поигрался с примером Tinic Uro по поводу новых методов класса Sound, в частности, extract():
function extract(target:ByteArray,
length:Number,
startPosition:Number = -1 ):Number;
- target - ByteArray, в который помещаются извлеченные сэмплы (samples);
- length - количество сэмплов. Сэмпл содержит левый и правый каналы, каждый из которых представляет числа с плавающей точкой.
- startPosition - позиция, с которой начнется извленение. Если она не указана, то извлечение будет идти с начала.
- extract() - возвращает количество сэмплов, но оно может быть меньше запрошенной длины в самом конце звука.
package
{
import flash.display.Sprite;
import flash.events.*;
import flash.media.*;
import flash.net.URLRequest;
import flash.utils.ByteArray;
public class SoundTest extends Sprite
{
private var mp3sound0:Sound = new Sound();
private var mp3sound1:Sound = new Sound();
private var dynamicSound:Sound = new Sound();
private var samples0:ByteArray = new ByteArray();
private var samples1:ByteArray = new ByteArray();
public function SoundTest()
{
mp3sound0.addEventListener(Event.COMPLETE, loadComplete0);
mp3sound0.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
//загрузка первого файла
mp3sound0.load(new URLRequest("sound0.mp3"));
}
private function loadComplete0(event:Event):void
{
mp3sound1.addEventListener(Event.COMPLETE, loadComplete1);
mp3sound1.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
//загрузка второго файла по событию загрузки первого
mp3sound1.load(new URLRequest("sound1.mp3"));
}
private function onIOError(e:IOErrorEvent):void
{
trace(e.text);
}
private function loadComplete1(event:Event):void
{
//начало динамического наложения звуков
dynamicSound.addEventListener("samplesCallback",samplesCallback);
dynamicSound.play();
}
private function samplesCallback(event:SamplesCallbackEvent):void
{
//установка массивов на нулевую позицию
samples0.position = 0;
samples1.position = 0;
var len:Number = 1000;
//извлечение сэмплов в массивы
mp3sound0.extract(samples0, len);
mp3sound1.extract(samples1, len);
//установка массивов на нулевую позицию
samples0.position = 0;
samples1.position = 0;
for (var c:int = 0; c < len; c++)
{
//получение значение каналов и их сложение
var left:Number = samples0.readFloat() + samples1.readFloat();
var right:Number = samples0.readFloat() + samples1.readFloat();
//запись значений в объект динамического звука
dynamicSound.samplesCallbackData.writeFloat(left);
dynamicSound.samplesCallbackData.writeFloat(right);
}
}
}
}
вторник, мая 27, 2008
Новые методы и свойства старых классов FP10
ByteArray
clear()
deflate()
inflate ()
Mouse
cursor
ContextMenu
clipboardMenu
clipboardItems
link
Capabilities
hasColorCorrection
ApplicationDomain
domainMemory
MIN_DOMAIN_MEMORY_LENGTH
NetStream
farID
farNonce
info
nearNonce
peerStreams
onPeerConnect()
play2()
DIRECT_CONNECTIONS
NetConnection
farID
farNonce
maxPeerConnections
nearID
nearNonce
protocol
unconnectedPeerStreams
FileReference
data
load()
save()
Sound
extract()
sampleData
Microphone
codec
encodeQuality
framesPerPacket
Event
CLEAR
COPY
CUT
PASTE
SAMPLE_DATA
SELECT_ALL
Stage
enableColorCorrection
MovieClip
currentFrameLabel
Graphics
beginShaderFill()
drawGraphicsData()
drawPath()
drawTriangles()
lineBitmapStyle()
lineShaderStyle()
DisplayObject
blendShader
rotationX
rotationY
rotationZ
z
globalToLocal3D ()
local3DToGlobal ()
BitmapData
histogram()
BlendMode
SHADER
clear()
deflate()
inflate ()
Mouse
cursor
ContextMenu
clipboardMenu
clipboardItems
link
Capabilities
hasColorCorrection
ApplicationDomain
domainMemory
MIN_DOMAIN_MEMORY_LENGTH
NetStream
farID
farNonce
info
nearNonce
peerStreams
onPeerConnect()
play2()
DIRECT_CONNECTIONS
NetConnection
farID
farNonce
maxPeerConnections
nearID
nearNonce
protocol
unconnectedPeerStreams
FileReference
data
load()
save()
Sound
extract()
sampleData
Microphone
codec
encodeQuality
framesPerPacket
Event
CLEAR
COPY
CUT
PASTE
SAMPLE_DATA
SELECT_ALL
Stage
enableColorCorrection
MovieClip
currentFrameLabel
Graphics
beginShaderFill()
drawGraphicsData()
drawPath()
drawTriangles()
lineBitmapStyle()
lineShaderStyle()
DisplayObject
blendShader
rotationX
rotationY
rotationZ
z
globalToLocal3D ()
local3DToGlobal ()
BitmapData
histogram()
BlendMode
SHADER
четверг, мая 22, 2008
Открыт Google Maps API для Flash
Google наконец-то открыл API к своим картам. Igor Costa накатал небольшой примерчик на эту тему. И еще один пример.
вторник, апреля 29, 2008
Эффект Fade для текста без внедрения шрифта
Как известно, чтобы применить эффект Fade к тексту (плавное его появление и исчезновение), необходимо, чтобы соответствующий шрифт был внедрен в приложение. Но в результате размер приложения существенно увеличится. Чтобы избежать этого, но сохранить красоту эффекта, необходимо перед началом превратить текст в битмап с помощью пустого эффекта BlurFilter с нулевыми значениями:
Есть еще один способ - применить эффект Dissolve. В отличии от Fade, который работает непосредственно с элементом, Dissolve создает непрозрачный прямоугольник над элементом и работает уже с ним. Но этот эффект хорошо смотрится только на белом фоне, так как иначе он будет виден поверх нашего объекта.
Отсюда
private function addBlurFilter():void {
var bf:BlurFilter = new BlurFilter(0,0,0);
var myFilters:Array = new Array();
myFilters.push(bf);
label.filters = myFilters;
}А потом уже запускать эффект Fade.Есть еще один способ - применить эффект Dissolve. В отличии от Fade, который работает непосредственно с элементом, Dissolve создает непрозрачный прямоугольник над элементом и работает уже с ним. Но этот эффект хорошо смотрится только на белом фоне, так как иначе он будет виден поверх нашего объекта.
Отсюда
среда, марта 26, 2008
RubyIZUMI - опенсорсный RTMP сервер (MP4/H.264) для потокового Flash видео и аудио
Takuma Mori из Vixy.tv недавно зарелизил RubyIZUMI - открытый потоковый сервер (Ruby) для проигрывания H.264 видео.
Демо.
Демо.
вторник, марта 25, 2008
Атрибуты метатега SWF
Официально опубликованы все атрибуты метатега SWF
[SWF width="#"
height="#"
widthPercent="#"
heightPercent="#"
scriptRecursionLimit="#"
scriptTimeLimit="#"
frameRate="#"
backgroundColor="#"
pageTitle="String"]
Напомню, что данный тег должен располагаться непосредственно перед определением AS-класса:
[SWF(width="1024", height="768", frameRate="31", backgroundColor="#000000")]
public class Main extends Sprite {...
[SWF width="#"
height="#"
widthPercent="#"
heightPercent="#"
scriptRecursionLimit="#"
scriptTimeLimit="#"
frameRate="#"
backgroundColor="#"
pageTitle="String"]
Напомню, что данный тег должен располагаться непосредственно перед определением AS-класса:
[SWF(width="1024", height="768", frameRate="31", backgroundColor="#000000")]
public class Main extends Sprite {...
четверг, марта 20, 2008
Повышение производительности AS3 приложений
Здесь представлены некоторые приемы, которые помогут повысить производительность наших приложений:
1) Создавайте константы для часто используемых объектов типа new Point(0,0) или new Rectangle(0,0,320,240):
Быстрее на 838%
2) Сократите указания на статические члены классов. Вместо этого старайтесь использовать переменные пакета:
на 66% быстрее
3) Сохраняйте getter свойства в локальных переменных при их использовании более одного раза.
4) Создавайте собственные reflection-методы вместо использования getDefinitionByName(getQualifiedClassName(object))
быстрее на 5489%
5) Страрайтесь использовать строгое типизирование
6) Приводите к нужным типам, например, при чтении из массива.
Быстрее будет обращаться к image
7) Где возможно, используйте int вместо Number
8) Операторы побитового сдвига работают быстрее:
Побитовый сдвиг влево быстрее на 300% при умножении на любую степень двойки:
Побитовый сдвиг вправо быстрее на 350% при делении на любую степень двойки:
Извлечение компонентов цвета:
Объединение компонентов цвета:
9) Обмен значениями численных переменных без использования временной переменной:
Быстрее на 20%.
10) Инкремент/декремент.
Внимание: это пример понижения производительности, но зато есть возможность понизить читабельность кода для врагов:)
11) Смена знака с помощью NOT или XOR (говорят на 300% быстрее):
12) Подсчет остатка
Если делитель является степенью двух, то остаток можно подсчитать быстрее на 600% следующим образом:
остаток = делимое & (делитель - 1);
13) Проверка на четность/нечетность:
Быстрее на 600%.
14) Абсолютное значение. Версия 1 быстрее на 250%, чем Math.abs(), а версия 2 быстрее на 20%, чем версия 1.
15) Сравнение двух числе на равенство знаков
На 35% быстрее.
16) Быстрое конвертирование цвета из R5G5B5 в R8G8B8
R8 = (R5 << 3) | (R5 >> 2)
G8 = (R5 << 3) | (R5 >> 2)
B8 = (R5 << 3) | (R5 >> 2)
17) a++ быстрее, чем a = a + 1 и т.п.
18) Умножение быстрее деления.
Лучше использовать a = b*.5 вместо a = b / 2
19) int(1.5) быстрее, чем Math.floor(1.5)
Аналогично int(1.5) + 1 быстрее, чем Math.ceil(1.5)
1) Создавайте константы для часто используемых объектов типа new Point(0,0) или new Rectangle(0,0,320,240):
//вызов 100000 раз: 75мс
new Point(0,0);
//или
private static const POINT:Point = new Point(0,0);
//8мс
POINT;Быстрее на 838%
2) Сократите указания на статические члены классов. Вместо этого старайтесь использовать переменные пакета:
//15мс
SomeClass.somevar;
package somepackage{
public const somevar:int;
}
//8мс
somevar;
на 66% быстрее
3) Сохраняйте getter свойства в локальных переменных при их использовании более одного раза.
somesprite.graphics.clear();
somesprite.graphics.beginFill(0x000000);
somesprite.graphics.drawRect(0,0,10,10);
somesprite.graphics.endFill();
// лучше заменить на
var n:Graphics = somesprite.graphics;
n.clear();
n.beginFill(0x000000);
n.drawRect(0,0,10,10);
n.endFill();4) Создавайте собственные reflection-методы вместо использования getDefinitionByName(getQualifiedClassName(object))
utils reflection
// 503мс
var someclass:Class = getDefinitionByName(getQualifiedClassName(someObject));
// getter reflection
public class SomeClass {
public function get reflect():Class {
return SomeClass;
}
}
// 9мс
var someclass:Class = object.reflect();
быстрее на 5489%
5) Страрайтесь использовать строгое типизирование
6) Приводите к нужным типам, например, при чтении из массива.
Быстрее будет обращаться к image
var image: BitmapData = images[index];
image.getPixel(x,y)
//чем к
images[index].getPixel(x,y);7) Где возможно, используйте int вместо Number
8) Операторы побитового сдвига работают быстрее:
Побитовый сдвиг влево быстрее на 300% при умножении на любую степень двойки:
x = x * 2;
x = x * 64;
//равно:
x = x << 1;
x = x << 6;Побитовый сдвиг вправо быстрее на 350% при делении на любую степень двойки:
x = x / 2;
x = x / 64;
//равно:
x = x >> 1;
x = x >> 6;Извлечение компонентов цвета:
//24bit
var color:uint = 0x336699;
var r:uint = color >> 16;
var g:uint = color >> 8 & 0xFF;
var b:uint = color & 0xFF;
//32bit
var color:uint = 0xff336699;
var a:uint = color >>> 24;
var r:uint = color >>> 16 & 0xFF;
var g:uint = color >>> 8 & 0xFF;
var b:uint = color & 0xFF;Объединение компонентов цвета:
//24bit
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = r << 16 | g << 8 | b;
//32bit
var a:uint = 0xff;
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = a << 24 | r << 16 | g << 8 | b;9) Обмен значениями численных переменных без использования временной переменной:
var t:int = a;
a = b;
b = t;
//равно:
a ^= b;
b ^= a;
a ^= b;Быстрее на 20%.
10) Инкремент/декремент.
Внимание: это пример понижения производительности, но зато есть возможность понизить читабельность кода для врагов:)
i = -~i; // i++
i = ~-i; // i--11) Смена знака с помощью NOT или XOR (говорят на 300% быстрее):
i = -i;
//равно:
i = ~i + 1;
//или
i = (i ^ -1) + 1;12) Подсчет остатка
Если делитель является степенью двух, то остаток можно подсчитать быстрее на 600% следующим образом:
остаток = делимое & (делитель - 1);
x = 131 % 4;
//равно:
x = 131 & (4 - 1);13) Проверка на четность/нечетность:
isEven = (i % 2) == 0;
//равно:
isEven = (i & 1) == 0;Быстрее на 600%.
14) Абсолютное значение. Версия 1 быстрее на 250%, чем Math.abs(), а версия 2 быстрее на 20%, чем версия 1.
//версия 1
i = x < 0 ? -x : x;
//версия 2
i = (x ^ (x >> 31)) - (x >> 31);15) Сравнение двух числе на равенство знаков
eqSign = a * b > 0;
//равно:
eqSign = a ^ b >= 0;На 35% быстрее.
16) Быстрое конвертирование цвета из R5G5B5 в R8G8B8
R8 = (R5 << 3) | (R5 >> 2)
G8 = (R5 << 3) | (R5 >> 2)
B8 = (R5 << 3) | (R5 >> 2)
17) a++ быстрее, чем a = a + 1 и т.п.
18) Умножение быстрее деления.
Лучше использовать a = b*.5 вместо a = b / 2
19) int(1.5) быстрее, чем Math.floor(1.5)
Аналогично int(1.5) + 1 быстрее, чем Math.ceil(1.5)
среда, марта 12, 2008
пятница, февраля 29, 2008
Улучшаем Flash 9 IDE
Lee Brimelow предлагает вашему вниманию три кастомные панельки для Flash IDE:
- Event Generator - генератор событий. Необходимо выбрать мувиклип, открыть панель (Window > Other Panels), определить необходимые события, скопировать в буфер и потом вставить готовый код куда нужно. Это значительно облегчает монотонные записи добавления событий.
- Калькулятор - считаем не выходя из любимой IDE.
- Панель заметок позволяет легко сохранять интересные куски кода с названиями.
Подписаться на:
Сообщения (Atom)