PDA

Просмотр полной версии : Остановка всей анимации(ускорение работы флешки)


Hamid
24.04.2012, 12:40
Всем добрый день, есть флешка и в ней куча анимации в ней все движется и вертится.
Есть два вопроса:
1. Есть ли какой то способ оптимизации флешки, точнее ее анимации? Возможно ли какое то кэширование графики для ускорения или что то другое?
2. Есть функция остановки всей анимации, описанная ниже. Она что то отказывается работать, в качестве входной переменной передаю stage. Проблема в том, что есть классы которые много раз перенаследуются и функция getQualifiedSuperclassName не помогает, что можете посоветовать?
public static function stopAllAnimation(dObj:*):void
{
if (getQualifiedSuperclassName(dObj) == 'flash.display::MovieClip'
|| getQualifiedSuperclassName(dObj) == 'flash.display::Sprite'
|| getQualifiedSuperclassName(dObj) == 'flash.display::DisplayObjectContainer'
|| getQualifiedClassName(dObj) == 'flash.display::MovieClip'
|| getQualifiedClassName(dObj) == 'flash.display::Sprite'
|| getQualifiedClassName(dObj) == 'flash.display::DisplayObjectContainer')
{
if (getQualifiedClassName(dObj) == 'flash.display::MovieClip'
|| getQualifiedSuperclassName(dObj) == 'flash.display::MovieClip')
{
MovieClip(dObj).gotoAndStop(0);
}
for (var i:uint = 0; i < DisplayObjectContainer(dObj).numChildren; i++)
stopAllAnimation(DisplayObjectContainer(dObj).getChildAt(i));
}
}

Заранее всем спасибо!

Aquahawk
24.04.2012, 12:47
откуда вы это взяли и зачем вы это делаете? Может стоит использовать оператор is? И вообще зачем такое творить?

Hamid
24.04.2012, 12:56
Не откуда не взял, сам написал), is не всегда работает корректно. Он тоже не подходит. Это нужно для проверки приложения. Т.е. мне нужно всех детей сцены перебрать и те из них которые мувики остановить.

Aquahawk
24.04.2012, 13:08
почему is то не работает? Рекурсивную функцию вам надо сделать, и если это контейнер то идти по детям и тормозить.

Добавлено через 4 минуты
public function stopAll(obj:DisplayObject):void {
if (!obj) return;

if (obj is MovieClip) (obj as MovieClip).stop();

var objContainer:DisplayObjectContainer = obj as DisplayObjectContainer;
if (objContainer) {
for (var i:int = 0; i < objContainer.numChildren; i++ ) {
stopAll(objContainer.getChildAt(i));
}
}
}

bublic_bicubic
24.04.2012, 13:13
воспользуйтесь лучше оператором is, он работает корректно всегда
public static function stopAllAnimation( dObj:* ):void {
if ( dObj is MovieClip ) {
( dObj as MovieClip ).gotoAndStop( 0 );
}
if ( dObj is DisplayObjectContainer ) {
for (var i:uint = 0; i < ( dObj as DisplayObjectContainer ).numChildren; i++) {
stopAllAnimation( ( dObj as DisplayObjectContainer ).getChildAt( i ) );
}
}
}

Aquahawk
24.04.2012, 13:13
приведите пример когда is не работает.

Добавлено через 39 секунд
bublic_bicubic:drinks:

Hamid
24.04.2012, 13:24
Aquahawk, bublic_bicubic - спасибо большое(+1). Я ошибся так работает гораздо лучше. Что касается не корректности is, был случай когда то, я вшивал графику Embed-ом в билдере, и при создании класса из этого эмбеда as не палил что там спайт, мувиклип. С тех пор я его боюсь использовать). А что можете подсказать по первому вопросу, есть вот такая штука cacheAsBitmap, но в каких случаях она имеет смысл я не совсем понял.

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

Aquahawk
24.04.2012, 13:34
А as и is не спалят ни спрайт ни мувиклип если эмбеддите графику руками, там толи битмап толи битмапдата будет, не помню точно.

cacheAsBitmap это отрисовка вектора в битмапу. Надо например если вы имеете сложную статическую векторную графику, градиенты там всякие, кривые, и вы это собираетесь двигать всё целиком, то тогда это дело отрисуется в битмап и будет двигаться растр. Применять надо совместно с pixelSnapping и целочисленными координатами.

Если у вас есть анимация, и вы сделаете cacheAsBitmap то, как правило, станет только хуже, потом что каждый кадр, когда что-то двигается плеер опять будет перерисовывать это в битмап, на следующем кадру удалять и опять перерисовывать. Может помочь только руками создать вектор этих битмап и их перещёлкивать.

Добавлено через 43 секунды
Ну и традиционно, ручной кешинг работает всегда лучше встроенного.

bublic_bicubic
24.04.2012, 13:43
Aquahawk, bublic_bicubic - спасибо большое(+1). Я ошибся так работает гораздо лучше. Что касается не корректности is, был случай когда то, я вшивал графику Embed-ом в билдере, и при создании класса из этого эмбеда as не палил что там спайт, мувиклип. С тех пор я его боюсь использовать). А что можете подсказать по первому вопросу, есть вот такая штука cacheAsBitmap, но в каких случаях она имеет смысл я не совсем понял.

cacheAsBitmap имеет смысл в случае если объект, которому выставляется cacheAsBitmap не анимируется внутри

Aquahawk
24.04.2012, 13:45
Интересно почему у меня cacheAsBitmap стало жёлтым. А вообще именно это и имел вииду, нет анимации => cacheAsBitmap может быть поможет. А может и не поможет.

Hamid
24.04.2012, 13:54
Всем спасибо, буду применять его только к спрайтам тогда. Я попробовал рекурсивно ко всем вроде все стало лучше.

Aquahawk
24.04.2012, 13:57
смотря что в спрайте лежат. Иногда тоже вредно. Поиграйтесь с ним, попробуйте так и сяк. Это надо просто один раз почувствовать. Просто так вслепую на все спрайты навесить скорее всего хуже только станет.