Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Остановка всей анимации(ускорение работы флешки) (http://www.flasher.ru/forum/showthread.php?t=178554)

Hamid 24.04.2012 12:40

Остановка всей анимации(ускорение работы флешки)
 
Всем добрый день, есть флешка и в ней куча анимации в ней все движется и вертится.
Есть два вопроса:
1. Есть ли какой то способ оптимизации флешки, точнее ее анимации? Возможно ли какое то кэширование графики для ускорения или что то другое?
2. Есть функция остановки всей анимации, описанная ниже. Она что то отказывается работать, в качестве входной переменной передаю stage. Проблема в том, что есть классы которые много раз перенаследуются и функция getQualifiedSuperclassName не помогает, что можете посоветовать?
Код AS3:

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 минуты
Код AS3:

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, он работает корректно всегда
Код AS3:

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

Цитата:

Сообщение от Hamid (Сообщение 1076740)
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

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


Часовой пояс GMT +4, время: 12:38.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.