Форум 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=116524)

0rion 03.10.2008 00:01

Отклик браузера на смену позиции при ресайзе.
 
Существует сцена, в центре которой стоит блок с Event.RESIZE который просто центрует этот блок при смене размера браузера.
Далее в этот блок грузится через getDefinition несколько инстансов разных swf файлов с документ классом. А так же помимо эти внешних классов просто картинка обёрнутая в movieclip.
При быстрой смене размера браузера (тупо взял за край и подёргал мышкой) движения мувика с картинкой по отклику в несколько раз превышает основной блок.
Тобишь картинка летает и центруется очень быстро, а блок иногда ваще зависает иногда ступенчето с низким fps двигается.
Помимо этого с разной скоростью центруются мувиклипы внутри самого блока. (Нарушается внутреняя центровка)
В Мозилле это особенно чувствуется.
Странно особенно то, что смену позиции при ресайзе мувиклип с картинкой наследует от главного блока, но при этом главный блок медленей обновляет свою позицию.

Как можно закрепить все элементы для синхронно движения, и вообще почему это происходит? (Возможно выход как-то реорганизовать клипы повесив на каждый Event Resize?)

Загрузка в сцену несколько инстансов таким методом
Код:

thumb=evt.target.applicationDomain.getDefinition("thumb");       
thumb1=new thumb();
.....
stage.addChild(thumb1);
thumb1.customMadeFunctionStart();

Насколько загружает сцену ? (Допустим есть 5 новых классов и по несколько инстансев каждого присудствует на сцене)
Какая алтернатива улучшит перформанс всей сцены в целом?

В програмирование я не первый год, основные языки C++, Java, PHP.
С самим АС3 проблем нет, но вот с тонкастями и обходыми путями совсем не знаком, делаю первый проект на АС, обгуглил всё, ответа не нашёл.
Памажите чем кто может!

0rion 03.10.2008 18:23

Скажите хотябы насчёт последнего.
Насколько это оптимально создавать внешние swf c мувиклипом и документирвоаным классом.
А потом загружать весь класс в основную сцену, и создавать его инстансы?
Код преведён выше.
Может ли такой подход значительно подтормаживать обработку сцены?
Ести ли альтернативные методы?

0rion 05.10.2008 00:49

Весело...
что ниодного знатока applicationDomain.getDefinition() ???

iNils 05.10.2008 00:55

Пользователь 0rion получает предупреждение за флуд.
Отвечать вам никто не обязан, это сугубо добровольное желание.

silin 05.10.2008 14:18

>>Как можно закрепить все элементы для синхронно движения

как вариант: сосредоточить позиционирование всех элементов в одном обработчике..

причем здесь applicationDomain.getDefinition я не понял..,
имхо не при чем: попробуй собрать аналогичную схему их собственной библиотеки, думаю, что результат будет таким же

wvxvw 05.10.2008 16:27

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

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

0rion 06.10.2008 23:31

silin,
Ты предлогаешь менять позицию всём элементам вместо того чтоб засунуть все элементы в один контейнер и его позиционировать? Есть довод что это поможет?
Насчёт applicationDomain.getDefinition : вообще хотел спросить насколько классы созданные таким методом и преминяемые в сцене сложны затрудняют рендер сцены?

wvxvw, Вешал таск менегер:( выше 2-3 процентов неподнимается.

Насчёт диспачера интересно.. может есть какая то инфа о перформансе разных браузеров касательно диспатчера?

silin 06.10.2008 23:52

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

у тебя получается, что элементы контейнера по разному реагируют на его позиционирование?

0rion 06.10.2008 23:56

Именно! Они все в контейнере.
На них самих вообще эвента нету.
Контейнер только позицию меняет, как следтвие элементы тоже, однако с разной чистотой и скоростью.

wvxvw 07.10.2008 00:30

Код:

FF3

update time: 9
update time: 9
update time: 8
update time: 7
update time: 9
update time: 7
update time: 7
update time: 8
update time: 9
update time: 8
update time: 8
update time: 8
update time: 8
update time: 8
update time: 8
update time: 8
update time: 8
update time: 9
update time: 7
update time: 9
update time: 8
update time: 7
update time: 7
update time: 6
update time: 6
update time: 9
update time: 8
update time: 8
update time: 9
update time: 8
update time: 8
update time: 9
update time: 8
update time: 8
update time: 8
update time: 6
update time: 7
update time: 7

IE6

update time: 13
update time: 11
update time: 10
update time: 7
update time: 4
update time: 4
update time: 4
update time: 4
update time: 4
update time: 5
update time: 5
update time: 5
update time: 88
update time: 11
update time: 13
update time: 5
update time: 5
update time: 5
update time: 12
update time: 12
update time: 11
update time: 5
update time: 5
update time: 5
update time: 12
update time: 12
update time: 6
update time: 6
update time: 5
update time: 5
update time: 12
update time: 12
update time: 4
update time: 6
update time: 6
update time: 5
update time: 5
update time: 5
update time: 5

Chrome

update time: 9
update time: 10
update time: 8
update time: 8
update time: 8
update time: 5
update time: 8
update time: 6
update time: 9
update time: 72
update time: 6
update time: 9
update time: 7
update time: 7
update time: 6
update time: 8
update time: 8
update time: 7
update time: 10
update time: 8
update time: 9
update time: 8
update time: 8
update time: 5
update time: 8
update time: 8
update time: 8
update time: 11
update time: 7
update time: 8
update time: 6
update time: 8
update time: 10
update time: 9
update time: 10
update time: 9
update time: 7
update time: 7
update time: 10

Код:

stage.scaleMode = StageScaleMode.NO_SCALE;
stage.addEventListener(Event.RESIZE, handleResize);
var t:int = getTimer();
var tf:TextField = new TextField();
tf.autoSize = TextFieldAutoSize.LEFT;
addChild(tf);
function handleResize(evt:Event):void
{
        t = getTimer() - t;
        tf.appendText("\rupdate time: " + t);
        t = getTimer();
}

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

0rion 07.10.2008 00:49

http://0rion.net.ru/video/index_dyn.html Вот общая модель.. потаскай за край...

silin 07.10.2008 01:03

если надпись и мувики лежат в одном контейнере, который только меняет положение при ресайзе, то это из серии 'не верь глазам своим', имхо не может быть такого..
нужен тестовый образец глюка

0rion 07.10.2008 01:04

Выше образец!

wvxvw 07.10.2008 01:37

Это как там получилось 3% CPU? у меня там за 80% уходит при ресайзе... =/ кроме всего... скорее всего координаты загружаемой картинки обсчитываются как-то не в нужное время / не от того меряешь... У меня бывают ситуации, когда после перетаскивания картинка вообще не становится на место... проблема не в ресайзе...
ЗЫ: вот делал, в принципе похожая задача (гордиться там нечем =) просто друг в запарке был - быстренько склепал и отдал =) но вроде таких глюков не наблюдаю...
http://www.storetail.co.il/
если надо могу исходники дать, но, ей богу, там ничего сверъестественного...

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

0rion 07.10.2008 01:54

Яфе меод :)
Незнаю что уж я мог сделать неправильно...
Вот код
Код:

this.stage.addEventListener(Event.RESIZE,center);

....

                public function center(evt:Event):void
                {
                        manager.conteiner.x=((manager.stage.stageWidth/2-manager.conteiner.width/2));
                        manager.m_on_black.x=((manager.stage.stageWidth/2-manager.conteiner.width/2));
}

Отрубил из сцены все внешние модули, ситуация не изменилась.
Интересные факты : При распечатки значения x сдвинутого элемента, отклик нереально быстрый. Распечатывает в сцене новое новую позицию УЖЕ ПРИСВОЕННУЮ элементу, в то время как САМ элемент не сдвинулся нинатолику!
Текстовые поля двигаются со скоростью отклика печати (тобишь очень быстро). А если нарисовать какой то графический элемент, он тормозит как всё остальное...
Вообщем странности.

Molecula 07.10.2008 02:30

У меня на 3-4% проц нагружало (4,2 Гц).

0rion, а почему:
Код:

manager.stage.stageWidth/2
а не
Код:

manager.width/2
?

0rion 07.10.2008 02:47

У меня комп под 3д заточен, так, что тоже нагрузки я не чувствовал.

manager.stage.stageWidth/2 = stage.stageWidth/2
Гепотетически можно и manager.width/2.
Там просто модульные изменения. Не почистил ещё код.

Вообщем ВСЁ товарищи . Проблема решена.
Сравните динамику движения при ресайзе :
http://0rion.net.ru/video/index_dyn.html
http://0rion.net.ru/video/index_dyn1.html

При том что оба хтмла кушают один и тот же swf файл. Разница чувствуется.
Коряво работает популярный swfobject.js, а как раз заплатка от флеша родная, работает хорошо.
Остерегайтесь. :)

Спасибо всем кто принял участие в дисскусие :)

wvxvw 07.10.2008 02:47

Ну, для красоты и простоты =)
Код:

manager.conteiner.x = (stage.stageWidth - manager.conteiner.width) << 1;
так, во-первых, координаты будут всегда целые (округленные в меньшую сторону), ну и вообще битовые операции быстрее арифметических =)
Ну и для плавности и уверенности, я бы делал так:
по евенту -> сначала проверить а действительно ли результат изменился (ну, за 4-8 тысячных секунды вполне мог и не изменится), если ничего не поменялось - ничего не делать (перерисовывать экран всем тяжело, а уж раз в 5 тысячных долей секунды и подавно... это ж практически 200 ФПС получается =) Затем, если изменение все-таки произошло -> 2 варианта развития событий: либо подождать планового обновления экрана и тогда все и отрисовать, либо, продвинутый вариант, перед обновлением экрана вызвать у стейджа инвалидате, и по событию рендера отрисовать то, что мы поменяли, ну или просто добавить updateAfterEvent, но эт тоже лишняя нагрузка.

ЗЫ: за 80% уходит когда перетаскиваешь, а не когда сайт просто работает...

Т.е. по научному, вообще, я бы в обработчике ресайза задавал координаты Recangle'ам а в обработчике ENTER_FRAME - отрисовывал бы графику соответственно позиции прямоугольников, и не было бы впечатления, что объекты двигаются с разной скоростью и т.д.

0rion 07.10.2008 02:48

Ага.. оптимизация с проверкой это интересно. Встрою, спасибо :)


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

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