Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   System.totalMemory: ударные темпы роста (http://www.flasher.ru/forum/showthread.php?t=135972)

tkaChuck 06.02.2010 03:13

System.totalMemory: ударные темпы роста
 
Здравствуйте.

имеем [CENSORED]
в левом верхнем углу там видно System.totalMemory.
перемещаясь по portfolio, можно легко убедиться, что System.totalMemory все время возрастает. когда доходит дело до видео то вообще.
водскажите пожалуйста, что я делаю не так?

класс для объекта галереи:
Код AS3:

package portfolio{
        import flash.events.*;
        import flash.display.Loader;
    import flash.display.LoaderInfo;
        import flash.display.MovieClip;
        import flash.net.URLRequest;
 
        public class portfolioPicture extends flash.display.MovieClip{
                public        var        _picture:pic,
 
                                                loadDone:Boolean,
 
                                                under:MovieClip,
                                                preloader:MovieClip,
                                                pictureLoader:Loader,
                                                bu:transB;
 
                public function portfolioPicture(initPic:pic){
                        ////////////////////////////////////////
                        _picture=new pic;
                        _picture=initPic;
 
 
                        x=_picture.__x;
                        y=_picture.__y;;
 
 
 
                        ////////////////////////////////////////
                        under=new trans;
                        var ram:int=6;
                        with(under){
                                x=-ram;
                                y=-ram;
                                width=_picture.__width+ram*2;
                                height=_picture.__height+ram*2;
                                name="Underlay";
                        }
                        this.addChild(under);
 
                        ////////////////////////////////////////
                        loadDone=false;
 
                        preloader=new picPreload;
                        preloader.x=_picture.__width/2;
                        preloader.y=_picture.__height/2;
                        preloader.scaleX=preloader.scaleY=.2;
                        preloader.name="Preloader";
                        addChild(preloader);
 
                        pictureLoader = new Loader();
                        pictureLoader.load(new URLRequest(_picture.__url));
                        pictureLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, _loaded,false,0,true);
                        pictureLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, _progress,false,0,true);
                        pictureLoader.name="Loader";
                        addChild(pictureLoader);
 
                        ////////////////////////////////////////
                        if(_picture.__isButton) {
                                bu=new transB;
                                bu.name="Button";
                                bu.width=_picture.__width,bu.height=_picture.__height;
                                bu.addEventListener(MouseEvent.MOUSE_DOWN,mousedown,false,0,true);
                                addChild(bu);
                        }
 
                        ////////////////////////////////////////
                        this.addEventListener(Event.REMOVED_FROM_STAGE,removedEvent,false,0,true);
                }
 
                function removedEvent(ev:Event){
                                this.removeEventListener(Event.REMOVED_FROM_STAGE, removedEvent);
                                destroy();
                        }
 
                function mousedown(e:MouseEvent){
                        (parent.parent as MovieClip)._lagrePic(_picture.__chapter,_picture.__part,_picture.__num);
                }
 
                function _loaded(e:Event){
                        loadDone=true;
                        stopLoadingProgress();
                        pictureLoader.width=_picture.__width;
                        pictureLoader.height=_picture.__height;
                }
 
                function _progress(e:ProgressEvent){
                        var tk:int=e.target.bytesLoaded/e.target.bytesTotal*100;
                        preloader.indicate(tk);
                }
 
                function destroy(){
                        stopLoader();
                        while(numChildren) removeChildAt(0);
                        if(_picture.__isButton) bu.removeEventListener(MouseEvent.MOUSE_DOWN,mousedown);
                        _picture=null,under=null,bu=null;
                        //trace("portfolio picture completely destroyed")
 
                }
 
                function stopLoader(){
                                if(pictureLoader) {
                                        removeChild(pictureLoader);
                                        if(loadDone){
                                                pictureLoader.unload();
                                                } else {
                                                pictureLoader.close();
                                                pictureLoader.unload();
                                                stopLoadingProgress();
                                                }
                                        }       
                                        pictureLoader=null;
 
                                }
 
                function stopLoadingProgress(){
                        pictureLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, _loaded);
                        pictureLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,_progress);
                        removeChild(preloader);
                        preloader=null;
                }
 
                }
}


класс для группы тумбнейлов:

Код AS3:

package portfolio{
        import flash.display.MovieClip;
        import flash.events.Event;
 
        public class portfolioThumbs extends flash.display.MovieClip{
                public function portfolioThumbs(partToBeDrawn:poItem){
                        for(var n=0;n<partToBeDrawn.thumbs.length;n++){
                                var thu:portfolioPicture=new portfolioPicture(partToBeDrawn.thumbs[n]);
                                thu.name=("thumb_N_"+n);
                                this.addChild(thu);
                        }
                        this.addEventListener(Event.REMOVED_FROM_STAGE,removedEvent,false,0,true);
                        }
 
                function removedEvent(ev:Event){
                                this.removeEventListener(Event.REMOVED_FROM_STAGE, removedEvent);
                                destroy();
                                }
 
                function destroy(){
                        while(numChildren>0) removeChild(getChildAt(0));
                        //trace("thumbnails destroyed");
                        }
                }
        }


wvxvw 06.02.2010 04:41

Для оформления кода используйте теги [as3][/as3].

tkaChuck 06.02.2010 05:54

да, прошу прощения.

tkaChuck 17.02.2010 06:11

да, насколько я могу судить, это главное. - и память свободна)

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

ответьте пожалуйста на такие вопросы а то я сам не уверен.
1. если объекты имеют ссылки друг на друга, но находятся не в дисплейлисте, и никто в дисплейлисте не имеет ссылок на эти объекты. будут ли они уничтожены?

2. неужели нет способа вызывать GC принудительно? А то, например, когда в галереее загружается видео, тоталмемори возрастает, потом (когда его уже типа удалили)снижается но не до исходной отметки, и очень не сразу. хотя я останавливаю видео и делаю unload(); .. и тормозит. на это видео натравить бы GC сразу как я отписался.

3. когда делаешь debug->list objects (ctrl-L), видишь там только элементы дисплейлиста. их и так видно, а как увидеть те которые НЕ в дисплейлисте?

4. Почему не работает download? имеем
Код AS3:

var fileRef:FileReference=new FileReference();
var req:URLRequest = new URLRequest("http://www.eyesofdream.com/resume.pdf");
fileRef.download(req,"resume.pdf");

выбор куда сохранять происходит, и все. тишина.

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

6. что происходит с объектами, которые не в текущем кадре? вот, скажем, у меня есть в кадре #40 такое.
Код AS3:

buttonPDF.addEventListener(MouseEvent.CLICK,clickPDF,false,0,true);

.
и вот, я перехожу в соседний кадр. кнопки больше в дисплейлисте нет. в списке объектов (в дебаггере List Objects) ее нет. но память она занимает и со временем никуда не девается! или нет?
7. когда вызывается fileReference.browse(), то все останавливается. как это вызвать самостоятельно?

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

etc 17.02.2010 07:38

Картинки каких размеров?
И да, потребление 400+ мегабайт памяти и 120% двухядерного процессора — не самое лучшее достоинство сайта. Я бы сказал, главная особенность.

tkaChuck 17.02.2010 09:54

а, картинки маленьки ваще..

Да, как бы нифига ни разу не круто. У меня 140%. Еще это небо. Оно обязательное условие в "дизайне".. Оно в эти 140 делает значительный вклад. Дополнительный вопрос: как можно оптимизировать проигрывание ролик на фоне? сейчас это видео на таймлайне

etc 17.02.2010 10:52

Цитата:

Сообщение от tkaChuck (Сообщение 887155)
Дополнительный вопрос: как можно оптимизировать проигрывание ролик на фоне?

Убрать его вообще. Равно как и проплывающие хреновины.

scarbo 17.02.2010 10:53

Ох, ты ё, это видео, а я думал что Вы так с PerlinNoise так зафигачили.
Ну во-первых убрать видео с тамлайна, и запустить сайт без него.
У Вас же сайт-то простой, там нет ничего такого чтобы жрало ресурсы.
Попробуйте убрать фоновое видео, и потом летающие штуки, Вы их удаляете,когда они за экран уходят?

TERRORist 17.02.2010 11:34

Цитата:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at portButtonMain/_activate()
at portButtonMain/frame10()
ошибка

tkaChuck 18.02.2010 13:51

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

Старый анекдот. Водитель выходит из автобуса и начинает чинить. Тут к нему подходит мальчик и говорит: Дядя я знаю, что у вас сломалось. Водитель кричит: Ну и что у меня сломалось??? Мальчик отвечает: Дядя у вас сломался автобус.

вы простите за сарказм, просто поймите правильно. я делаю все что знаю, но элементарный сайт жрет раз в 20 больше чем должен. Это мой первый проект на АС3.. вот что я делаю. я зануляю все ссылки на объекты, которые мне больше не нужны. тоесть делаю этим переменным =null. Я отписываюсь от всех листенеров, и на всякий случай всегда юзаю weakReference. лоадерам всем я делаю unload.

я положил там два класса. ими одними можно добиться невиданных тормозов, поверьте)

wvxvw 18.02.2010 14:29

ОК :)
Не ставьте интерактивные объекты над видео, обрежте FPS видео, как минимум вдвое, а лучше в четыре раза, можно и резолюцую так же. Упаси боже использовать фильтры и прозрачности над видео, вообще фильтры занимающие большую площадь будут тормозить, а так как видео все время заставляет перерисовывать картинку, то то, что вы сделали, это примерно по смыслу то же самое, что вместо того, чтобы отрендерить видео из 3Dmax'a один раз и проигрывать его, вы показываете процесс рендеринга.

Bgg 18.02.2010 14:45

Цитата:

Сообщение от tkaChuck (Сообщение 887155)
Еще это небо. Оно обязательное условие

Да, это засада.
Если уж у вас Всё перерисовывается, то может быть уломать заказчика сделать фиксированное разрешение сайта? там 750х600, информации то мало.

kackbip 18.02.2010 14:53

Красивый сайт. Жаль что тормозит

tkaChuck 18.02.2010 15:12

2wvxvw спасибо за ответ. да, я понимаю. но понижать качество видео больше некуда. фильтры и альфу я там и так почти не юзаю.. я понимаю что затрат ресурсов не избежать так чтоб уж совсем, но. скажите, между видео на таймлайне и классами videoPlayer и FLVVideoPlayer есть какаято разница в производительности? теоретически я думал еще о таком. это мог бы быть сиквенс из jpg, которые все бы присутсвовали в памяти постоянно, и в каждом следующем кадре атачился следующий и детачился предыдущий.. понимаете о чем я? они бы много весили, но трафик здесь не имеет особого значения. Важнее хоть както выиграть в производительности.
2Bgg. А оно не ресайзится. На что уламывать?
2kackbip. Спасибо. Это мы преодолеем.

Добавлено через 3 минуты
главная беда не проц, а 400 мб. ЧТО НЕ ТАК С МОИМИ КЛАССАМИ?

Fernando Costa 18.02.2010 15:35

посмотри в профайлере что жрет ресурсы.

tkaChuck 18.02.2010 16:26

в чем??

wvxvw 18.02.2010 16:35

Flex / Flash Builder

tkaChuck 18.02.2010 16:47

уууу, я использую flash cs3.

Добавлено через 2 минуты
сии продукты казались мне чемто профессиональным и пугающим. я открою в них проект который делал просто флешом?

wvxvw 18.02.2010 17:19

Четверый билдер вроде умеет импортировать флешевые проекты, но он еще в бете... если чесно - я не пробовал.

N1KY 19.02.2010 04:10

Насколько я знаю, даже вторая бета 4-го билдера еще не может этого делать.. У tkaChuck наверняка многое во *.fla-файле, а билдер пока-что их не умеет переваривать, хотя вроде в финалке должны это сделать:)

tkaChuck 19.02.2010 13:44

спасибо всем за ответы..

2N1KY: да, у tkaChuck там многое, уж вы мне поверьте)

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

однако билдер билдером, а вопросы, перечисленные выше, остаются открытыми.

Rosco 19.02.2010 15:48

Так что, на заднем плане видео?
А зачем вообще делать летящие облака при помощи видео?
(к тому же оно и не так уж и заметно при просмотре сайта)
Возьмите картинку(не очень большую...в крайнем случае под размер сайта...хотя я бы вам советовал просто меньший размер и allow smoothing).
Сделайте картинку тайловой (благо с небом это не сложно) и пускайте банальный motion tween...когда картинка выходит за пределы сцены - возвращайте её на нулевую координату...чтобы не было эффектов разрыва просто дублируйте мувиклип с небом несколько раз и пусть они летят друг за другом...в любом случае места в оперативке это дублирование не займёт!Вот и всё! Ну и делайте всё остальное о чём уже сами писали...это лишним не будет. И не мешало бы регулятор громкости с кнопкой отключения звука поставить...я глубоко уважаю Jesse Cook'a но в данном случает вообще музыка ИМХО слишком навящевая и резкая для фона...под такое не почитаешь...попробуйте чтото более атмосферное.
Для того чтобы посмотреть в Flash CS3 что жрёт ресурсы :
File --> PublishSetting --> Ставите галочку Generate Size Report...с внешними классами не пробывал, но должно сработать!
Ну и фильтры юзать при анимации столь массивных объектов ВООБЩЕ не надо..отключите все фильтры и увидите какой будет прирост в производительности! Если уж надо эффекты, в вашем случае лучше в PS прорисовать перед импортом.

И в разделе RESUME пдф'ка выходит за пределы границ сайта, а это не есть красиво!Поправь!

GentleFLASH 19.02.2010 17:00

Если что, так видео можно отрендить в bitmapData последовательность, и потом уже показывать ее, а само видео остановить и выгрузить. Правда последовательность картинок, с таким разрешением, памяти порядком съесть должна. Или можно, как сказал Rosco, сделать обычным motion tween.

tkaChuck 19.02.2010 22:19

хм, это заговор? мне начинает казаться, что я попал в кошмар. на этом форуме есть только я и Капитан Очевидность на другом конце. не подумайте, я очень ценю вашу помощь, ребята.. помощь.

2Rosco: Дружище! Как неоднократно упоминалось, видео на фоне является обязательным условием. Не поверите, но мне приходило в голову, что елозить статической картинкой легче чем целым видео. спасибо за детальное описание технологии. места в памяти и правда не займет, Вы совершенно правы. Но боюсь при таком раскладе "Вот и все!" кричать буду не я, а заказчик). Что до саундтрека, полностью согласен. Я этого Cook'a так даже и не уважаю.
Generate Size Report, как явствует из названия, генерит репорт о размере файла. рядом с ресурсами сие не стоит вообще никак. что именно должно сработать с внешними классами, останется тайной для всех нас.

фильтры отключал. там только glow на вертикальных надписях. вообще никакой разницы. отключал все вообще. достаточно двух приведенных выше классов. создаем страницу тумбнейлов, переходим на другую (удаляем старую(и причем так удалем что мокрого места не остается по идее)), повторяем 10 раз, имеем висячий браузер. ЧТО НЕ ТАК С НИМИ РЕБЯТА???????

2GentleFLASH: о, а вот за это реально большое спасибо! памяти терять нечего). тоетсь если я буду покадрово атачить секвенцию из битмапдаты, это будет машине проще чем показывать видео? разве сам по себе показ видео не есть аналогичный процесс? поясните пожалуйста, если не сложно.. и я это, как я отрендерю видео в такую секвенцию, да еще и незаметно для пользователя?

еще ктото упоминал perlin noise. глазу заказчика милы облака, которые ближе и дальше от нас движутся с разной скоростью. можно оперировать несколькими твинами на разной скорости, мешать их multiply, но выходит довольно убого а тормозит тоже не слабо. большие прозрачные битмапы ездят, вы понимаете. от этого нас предостерегает даже хелп. но perlin noise - может быть чтото подобное можно генерить и это будет быстрей чем проигрывать видео??? я пока очень плохо себе представляю что это такое.

Добавлено через 3 минуты
Ну и делайте всё остальное о чём уже сами писали...это лишним не будет. [истерический смех].. тока не баньте за сарказм.

wvxvw 20.02.2010 01:15

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

N1KY 20.02.2010 07:14

tkaChuck чтобы точнее отслеживать расходуемую память скачай класс Stats. А еще лучше поставь De MonsterDebugger, с ним ты сможешь еще детальнее оценить что вообще происходит в твоем коде, и поискать где конкретно у тебя забивается память.

tkaChuck 20.02.2010 16:25

2wvxvw спасибо за совет! дебаг билд, хмм.. я не знал что такое бывает. сейчас почитаю про него и сделаю.
2N1KY ооо ВАЩЕЕЕЕЕЕ, помему это то что я искал


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

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