Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   торможение ролика по истечении времени (http://www.flasher.ru/forum/showthread.php?t=115394)

darkvam 28.08.2008 16:25

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

MrPoma 28.08.2008 17:10

Надо код посмотреть.

chingachgoog 28.08.2008 18:39

посмотрите поиском про протечки памяти - может поможет.

darkvam 28.08.2008 20:09

MrPoma
весь код показать? там строк 280.
вот такой тип функции меня настораживает. дело в том что для такого рода клипа не работает WITH()

Код:

_root["PlazmaShip2"+plazmanum].onEnterFrame = function()
chingachgoog
поиск не помог. там у большинства проблемы с памятью в AS3 где такая проблемма может быть решена. у мня AS2.

и сразу чтоб не создавать тему такая проблема:
Код:

attachMovie("PlazmaShipbrake", "plazmaShipbrake", this.getNextHighestDepth());
attachMovie("PlazmaShipbrake", "plazmaShipbrake2", this.getNextHighestDepth());

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

MrPoma 28.08.2008 20:32

Код:

_root["PlazmaShip2"+plazmanum].onEnterFrame = function()
Наверняка Вы не удаляете отработавшие onEnterFrame'ы.

darkvam 28.08.2008 20:58

MrPoma
ЭЭэ.. нет. если пуля улитает за границы экра я делаю так:
Код:

_root["PlazmaShip2"+plazmanum].removeMovieClip()
и остаюсь доволен. подскажите пожалуйста как наряду с этим уничтожить и отработавшую функцию?

dirigableNorge 29.08.2008 02:49

Самый простой способ
Код:

_root["PlazmaShip2"+plazmanum].onEnterFrame = undefined;
По поводу attachMovie - проверь трэйсом this.getNextHighestDepth() - у меня он плохо работает при многократных вызовах. Поэтому я делаю так:
Код:

var depth:Number = this.getNextHighestDepth();
attachMovie("PlazmaShipbrake", "plazmaShipbrake", depth);
depth++;
attachMovie("PlazmaShipbrake", "plazmaShipbrake2", depth);
depth++;

А не создается потому, что аттачаться мувики на одну глубину.

Molecula 29.08.2008 02:56

Код:

onEnterFrame = null;
280 - это очень не много.

darkvam 29.08.2008 08:12

dirigableNorge
спасибо большое за помощь
Molecula
спасибо! 280 - немного. но это только начало)))

darkvam 29.08.2008 09:12

dirigableNorge
Molecula
непомогает...(((

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

Код:

stop();
import flash.filters.DropShadowFilter;
var dropShadowOut:DropShadowFilter = new DropShadowFilter(5, 135, 0x000000, 1, 7, 7, 1.5, 1, false);
//массив пушек для уровня
for (i=0; i<1; i++) {
        attachMovie("Gun", "gun"+i, i+100, {_x:700, _y:_root.asteroidlvl._y+2670});
}
var gunElements:Array = [gun0];
for (l=0; l<gunElements.length; l++) {
        gunElements[l].GunGround.filters = [dropShadowOut];
}
var ArrSmoke:Array = [];
//переменная глубины
depth = this.getNextHighestDepth();
//переменная времени для определения закрытия OpenMediaOption------------
w = 0;
//устанавливаем качество изображения-------------------------------------
_quality = "LOW";
//хз---------------------------------------------------------------------
timeshoot = 30;
//Звуковые файлы
var voice1:Sound = new Sound();
_global.voice1 = voice1;
_global.voice1.attachSound("voice1");
//текст для MediaTextWindow----------
m = 0;
tt2 = "Обнаружены вражеские корабли численностью в 22 единицы.";
//Скорость перезарядки орудий корабля
_global.shootreload = 10;
shootreload = 10;
//количество плазмо-пуль
plazmanum = 0;
//уровень корябля выше дыма делаем на слое 100
tank.swapDepths(100);
//масссив дыма, который будет создавать
var ArrSmoke:Array = [];
//переменная счетчик дыма, сколько создали копий
var trailNum:Number = 0;
stopping = false;
var speed = _global.speedTank;
// скорость танка
var speedRot = _global.rotationTank;
// скорость кручения
onEnterFrame = function () {
        WaitOpenMediaOption();
        MediaText();
        ramkiMoving();
        shipMoving();
        _global.speedTank = speed;
        SnegLvlMov._y -= speed*0.45*Math.sin(tank._rotation*(Math.PI/180));
        asteroidlvl._y -= speed*1.8*Math.sin(tank._rotation*(Math.PI/180));
        //Всё для пушек
        for (k=0; k<gunElements.length; k++) {
                gunElements[k]._y = _root.asteroidlvl._y+2670;
                if (tank._y<gunElements[k]._y+600) {
                        _root.attachMovie("PlazmaGun", "plazmaGun", depth);
                        depth++;
                        _root.plazmaGun._x = gunElements[k]._x;
                        _root.plazmaGun._y = gunElements[k]._y;
                        _root.plazmaGun.play();
                        gunElements[k].GunTower.play();
                        gunElements[k].GunTower._rotation = Math.atan2(gunElements[k]._y-tank._y, gunElements[k]._x-tank._x)/(Math.PI/180);
                        if (_root.plazmaGun._currentframe<5) {
                                _root.plazmaGun._rotation = gunElements[k].GunTower._rotation;
                        }
                }
        }
        tank._x += speed*Math.cos(tank._rotation*(Math.PI/180));
        // управление-------------------------------------; 
        //Стрельба;
        if (Key.isDown(Key.SPACE)) {
                shootreload++;
                if (shootreload>=_global.shootreload) {
                        plazmanum += 1;
                        _root.attachMovie("PlazmaShip", "PlazmaShip"+plazmanum, depth, {_x:tank._x, _y:tank._y});
                        depth++;
                        _root.attachMovie("PlazmaShip2", "PlazmaShip2"+plazmanum, depth, {_x:tank._x, _y:tank._y});
                        depth++;
                        _root["PlazmaShip"+plazmanum]._rotation = tank._rotation;
                        _root["PlazmaShip"+plazmanum].gotoAndPlay(2);
                        _root["PlazmaShip2"+plazmanum]._rotation = tank._rotation;
                        _root["PlazmaShip2"+plazmanum].gotoAndPlay(2);
                        _root["PlazmaShip"+plazmanum].lasttankrot = tank._rotation;
                        _root["PlazmaShip2"+plazmanum].lasttankrot = tank._rotation;
                        shootreload = 0;
                }
        } else {
                shootreload = 10;
        }
        //покадрово для каждой из двух пуль
        //-------------1---------------------
        _root["PlazmaShip"+plazmanum].onEnterFrame = function() {
                if (this.hitTest(gun0.GunTower)) {
                        attachMovie("PlazmaShipbrake", "plazmaShipbrake", depth);
                        depth++;
                        plazmaShipbrake._xscale = 60;
                        plazmaShipbrake._yscale = 60;
                        plazmaShipbrake._x = this._x;
                        plazmaShipbrake._y = this._y-10;
                        plazmaShipbrake._rotation = this._rotation-180;
                        plazmaShipbrake.gotoAndPlay(2);
                        this.removeMovieClip();
                        this.onEnterFrame = null;
                }
                if (this._currentframe<5) {
                        this._rotation = tank._rotation;
                        this._x = tank._x;
                        this._y = tank._y;
                } else {
                        this._x += 15*Math.cos(this.lasttankrot*(Math.PI/180));
                        this._y += 15*Math.sin(this.lasttankrot*(Math.PI/180));
                        if (this._x>1024 || this._x<0 || this._y>678 || this._y<0) {
                                this._alpha = 0;
                        }
                        if (this._x>1524 || this._x<-500 || this._y>1178 || this._y<-500) {
                                this.removeMovieClip();
                                this.onEnterFrame = null;
                        }
                }
        };
        //----------------2--------------------
        _root["PlazmaShip2"+plazmanum].onEnterFrame = function() {
                if (this.hitTest(gun0.GunTower)) {
                        attachMovie("PlazmaShipbrake", "plazmaShipbrake2", depth);
                        depth++;
                        plazmaShipbrake2._xscale = 60;
                        plazmaShipbrake2._yscale = 60;
                        plazmaShipbrake2._x = this._x;
                        plazmaShipbrake2._y = this._y+10;
                        plazmaShipbrake2._rotation = this._rotation-180;
                        plazmaShipbrake2.gotoAndPlay(2);
                        this.removeMovieClip();
                        this.onEnterFrame = null;
                }
                if (this._currentframe<5) {
                        this._rotation = tank._rotation;
                        this._x = tank._x;
                        this._y = tank._y;
                } else {
                        this._x += 15*Math.cos(this.lasttankrot*(Math.PI/180));
                        this._y += 15*Math.sin(this.lasttankrot*(Math.PI/180));
                        if (this._x>1024 || this._x<0 || this._y>678 || this._y<0) {
                                this._alpha = 0;
                        }
                        if (this._x>1524 || this._x<-500 || this._y>1178 || this._y<-500) {
                                this.removeMovieClip();
                                this.onEnterFrame = null;
                        }
                }
        };
        //------------------------------------------------------------------------------
        //влево танк;                                                                                             
        if ((Key.isDown(65)) || (Key.isDown(37))) {
                _global.speedTank = _global.speedTank-4;
                tank._rotation -= speedRot;
        }
        if ((Key.isDown(68)) || (Key.isDown(39))) {
                // вправо;
                _global.speedTank = _global.speedTank-4;
                tank._rotation += speedRot;
        }
        if ((Key.isDown(87)) || (Key.isDown(38))) {
                // впепед;
                if (tank._currentframe == 1) {
                        tank.gotoAndPlay(2);
                }
                stopping = false;
                if (speed<4) {
                        speed += 0.1;
                }
                if (speedRot>4) {
                        speedRot -= 0.5;
                }
                tank._x += speed*Math.cos(tank._rotation*(Math.PI/180));
        } else {
                if (tank._currentframe == 20) {
                        tank.gotoAndPlay(21);
                }
                if (speed != 0.5) {
                        stopping = true;
                }
        }
        if ((Key.isDown(83)) || (Key.isDown(40))) {
                // назад;
                if (speed>0.5) {
                        speed -= 0.1;
                }
                if (speedRot<6) {
                        speedRot += 0.5;
                }
        }
        if (stopping == true) {
                if (speed>0.5) {
                        speed -= 0.05;
                        if (speedRot<6) {
                                speedRot += 0.5;
                        }
                        tank._x += speed*Math.cos(tank._rotation*(Math.PI/180));
                }
        }
};
_global.speedTank = speed;
function ramkiMoving() {
        //выставляем рамки движения и динамическую камеру
        //динамо камера
        if (tank._rotation>=0 && tank._rotation<=180) {
                if (tank._y>200) {
                        tank._y -= speed;
                        SnegLvlMov._y -= speed/4;
                        asteroidlvl._y -= speed;
                        for (var i = ArrSmoke.length-1; i>=0; i--) {
                                ArrSmoke[i]._y -= Math.sin(tank._rotation*(Math.PI/180))+speed;
                        }
                }
        } else {
                if (tank._y<500) {
                        tank._y += speed;
                        SnegLvlMov._y += speed/4;
                        asteroidlvl._y += speed;
                        for (var i = ArrSmoke.length-1; i>=0; i--) {
                                ArrSmoke[i]._y += Math.sin(tank._rotation*(Math.PI/180))+speed;
                        }
                }
        }
        //Рамки по иксу 
        if (tank._x<=50) {
                if (tank._rotation>=0 && tank._rotation<=180) {
                        tank._x = 494.5;
                        tank._y = 200;
                } else {
                        tank._x = 494.5;
                        tank._y = 500;
                }
        }
        if (tank._x>=974) {
                if (tank._rotation>=0 && tank._rotation<=180) {
                        tank._x = 494.5;
                        tank._y = 200;
                } else {
                        tank._x = 494.5;
                        tank._y = 500;
                }
        }
}
function shipMoving() {
        //добавляем новые копии дыма в массив
        ArrSmoke.push(smoke.duplicateMovieClip("smoke"+trailNum, trailNum));
        //устанавливает координаты корабля для дыма
        _root["smoke"+trailNum]._x = tank._x;
        _root["smoke"+trailNum]._y = tank._y;
        _root["smoke"+trailNum]._rotation = tank._rotation;
        //увеличиваем счетчик
        trailNum++;
        //если ставить очень большое число, до будет тормрзить движение
        if (trailNum>10) {
                trailNum = 0;
        }
        //смотрим на массив с конца                                                                                                                                                                                                                                                                   
        for (var i = ArrSmoke.length-1; i>=0; i--) {
                //уменьшаем прозрачность и увеличиваем копии дыма
                ArrSmoke[i]._y -= speed*1.8*Math.sin(tank._rotation*(Math.PI/180));
                ArrSmoke[i]._alpha -= speed*4;
                ArrSmoke[i]._xscale += speed;
                ArrSmoke[i]._yscale += speed;
                //если дым невидим удаляем из массива и удаляем клип
                if (ArrSmoke[i]._alpha<=0) {
                        ArrSmoke.splice(0, 1);
                        ArrSmoke[i].removeMovieClip();
                        //trace(trailNum);
                }
        }
}
//Функция для текстовых предупреждений для окна MediaTextWindow-----------------------
function MediaText() {
        //*****печатная машинка****
        if (_root.MediaTextWindow._currentFrame == 42) {
                m++;
                _root.MediaTextWindow.MediaWindowText.text = substring(tt2, 0, m/2)+"_";
                if (m == 1) {
                        _global.voice1.start();
                }
        }
        //*****печатная машинка****                                                                       
}
//Функция проверки времени до автоматического закрытия OpenMediaOption----------------
function WaitOpenMediaOption() {
        if (_root.OpenMediaOption._currentFrame == 35) {
                if (!_root.OpenMediaOption.hitTest(_root.mouse)) {
                        w++;
                        if (w == 50) {
                                _root.OpenMediaOption.play();
                        }
                } else {
                        w = 0;
                }
        }
}


chingachgoog 29.08.2008 14:45

Цитата:

Сообщение от darkvam (Сообщение 760905)
chingachgoog
поиск не помог. там у большинства проблемы с памятью в AS3 где такая проблемма может быть решена. у мня AS2.

А чем тут AVM2 лучше чем AVM1?

Вот темы, если хорошо искать:

Flash and memory leaks

утечка памяти в setInterval и других функциях цикла

dirigableNorge 29.08.2008 15:16

Выложи исходник - так тяжело понять удаляется объект и функция объекта или нет.

darkvam 29.08.2008 18:36

Вложений: 2
dirigableNorge

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

darkvam 29.08.2008 18:41

chingachgoog
это я видел и прочёл уже от начало до конца. здесь совсем другая проблемма.

dirigableNorge 29.08.2008 20:53

Добавил к твоему коду свой:
Код:

this.createEmptyMovieClip("my_mc",2000);
my_mc.onEnterFrame = function(){
        i = 0;
        j = 0;
        k = 0;
        l = 0;
        //проверяем количество объектов в руте
        for (var prop in _root){
                i++
                //подсчитываем количество мувиклипов
                if (typeof(_root[prop])=="movieclip"){
                        var m:String = _root[prop]._name;
                        //подсчитваем количество выстрелов танка
                        if (m.substr(0,10)=="PlazmaShip"){
                                j++
                        //подсчитваем количество выстрелов турели
                        }else if(m.substr(0,5)=="smoke"){
                                l++
                        }
                        k++;
                //подсчитваем количество объектов
                }else if(typeof(_root[prop])=="object"){
                        k++
                }
        }
        trace(i+"  property "+j+" plazma "+k+" movieclips "+l+" smoke")
}

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

darkvam 30.08.2008 06:59

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

dirigableNorge 30.08.2008 12:57

Нет нет. Если запустить мой трэйс - можно будет увидеть, как плодятся мувиклипы. Они начинают плодится с безумной скоростью и при этом у них в названиях нет плазмы и дыма. Нужно очень внимательно проверить все циклы. У меня перестает работать трейс когда занчение k доходит до 1700 -1800. При этом видно, что количество плазм не превышает 20-25, а дыма вообще 6. Возможен такой вариант, что мувиклипы плодятся с другими именами?

darkvam 30.08.2008 19:34

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

Код:

if(_root.plazmagun._currentframe>60) {
_root.plazmagun.removeMovieClip()
}

непомогло... есть ли другие возможности удаление такого типа мувика? (как заноза)


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

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