PDA

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


Alexd21
24.02.2011, 20:42
Есть красивый эффект, но жрет память сильно и через некоторое время флеш начинает притормаживать.
Как освобождать память от динамических объектов которые уже не нужны?

Привожу код:


package
{
import com.greensock.*;
import com.greensock.easing.*;

import flash.display.*;
import flash.events.*;
import flash.geom.Rectangle;
import flash.media.*;
import flash.net.*;
import flash.system.*;
import flash.text.*;
import flash.utils.*;

public class test_star extends Sprite
{


public function test_star()
{
var currentcolor:uint = 0xffffff;

var timer_newstar:Timer = new Timer(10,0);
var timer_newcolor:Timer = new Timer(500,0);

timer_newstar.addEventListener(TimerEvent.TIMER,f_newstar);
timer_newcolor.addEventListener(TimerEvent.TIMER,f_newcolor);

timer_newstar.start();
timer_newcolor.start();



function f_newcolor (event:TimerEvent):void
{
currentcolor = Math.random() * 0xffffff;
TweenMax.to(class_img_star, 0.2, {tint: currentcolor});
}



function f_newstar (event:TimerEvent):void
{
var newstar:MovieClip = new class_img_star();

newstar.x = Math.random() * 550;
newstar.y = Math.random() * 400;

var targetX:Number = newstar.x + Math.random() * 10;
var targetY:Number = newstar.y + Math.random() * 10;
var targetRotation:Number = Math.random() * 360 - 180;

addChild(newstar);

TweenMax.to(newstar, 3, {alpha: 0, scaleX: 3, scaleY: 3, tint: currentcolor});
TweenMax.to(newstar, 3, {rotation: targetRotation, x: targetX, y: targetY});
TweenMax.to(newstar, 3, {blurFilter:{blurX:3, blurY:3}, onComplete: removeStar});



function removeStar():void
{
removeChild(newstar);
newstar = null;

}



}


}

}

}



Как удалять объекты newstar из памяти?

Добавлено через 54 минуты
покапался в ранних постах, законченные решения отсутствуют.
MemoryController, GC - не дают нужного эффекта.
они очишают память при её критичном заполнении.

а нужно: создался объект - отработал - удалился из памяти

cleptoman
24.02.2011, 22:17
1 - уберите вложенные функции
2 - твины подписывайте на окончание анимации и удаляйте целевой объект, если больше не нужен

Alexd21
24.02.2011, 22:24
1 - уберите вложенные функции
2 - твины подписывайте на окончание анимации и удаляйте целевой объект, если больше не нужен

1 - понятно
2- не очнь, если можно , как это сделать?

cleptoman
24.02.2011, 22:32
перефразирую...задайте метод, который будет идентифицировать объекты как ненужные. навскидку на ум приходит какой-нибудь хендлер окончания анимации. поймали событие, целевой твин получили, целевой объект получили, убили. применительно к TweenMax не знаю -не щупал. но, думаю, в целом мысль понятна. это - необязательно твин, момент ненужности объекта может быть совсем другим в вашем контексте.

Psycho Tiger
24.02.2011, 22:35
У TweenMax это onComplete: someFunction внутри params.

Alexd21
24.02.2011, 22:51
перефразирую...задайте метод, который будет идентифицировать объекты как ненужные. навскидку на ум приходит какой-нибудь хендлер окончания анимации. поймали событие, целевой твин получили, целевой объект получили, убили. применительно к TweenMax не знаю -не щупал. но, думаю, в целом мысль понятна. это - необязательно твин, момент ненужности объекта может быть совсем другим в вашем контексте.

в общем мысль ясно, но вся веселуха начинается на слове "убили".

Какой командой на as3 "убивается" ненужный объект?
delete - удаляет лишь свойства объектов, но не сами объекты.
"объект" = null - память тоже не освобождает

TanaTiX
24.02.2011, 23:08
removeChild(объект)

Psycho Tiger
24.02.2011, 23:15
А никак не освободить память конкретно Вам. Заnullить все ссылки, а дальше как повезёт.

Alexd21
24.02.2011, 23:16
removeChild(объект)

если бы....
removeChild(объект) - удаляет объект только со сцены, в памяти он остается, addChild(объект) - легко добавит его обратно :)

можете включить профилер, если не верите.

petyar
24.02.2011, 23:24
А никак не освободить память конкретно Вам. Заnullить все ссылки, а дальше как повезёт.
По логике GC должен убить объект после зануления всех ссылок же?

Alexd21
24.02.2011, 23:34
По логике GC должен убить объект после зануления всех ссылок же?

GC - освобождает память, все верно. Но объекты создаются очень быстро и много. Поэтому 2-3 секунда программа работает как надо, потом начинаются тормоза, все замедляется. GC - память освобождает незначительно, тормоза остаются.

Прикладываю файл проект. Посмотрите кому интересно как сие чудо работает.

easy.proger
24.02.2011, 23:41
forceGC (http://silin.su/#AS3/utils/gc)

Aloran
24.02.2011, 23:52
to Alex21 А что вы хотели... вы за одно время генерируете звезд больше чем удаляете (при удалении первой звезды вы уже нагенерировали 10000). Естественно у вас все со временем начнет тормозить.
и еще TweenMax.to(newstar, 3, {alpha: 0, scaleX: 3, scaleY: 3, tint: currentcolor});
TweenMax.to(newstar, 3, {rotation: targetRotation, x: targetX, y: targetY});
TweenMax.to(newstar, 20, {blurFilter:{blurX:3, blurY:3}, onComplete: removeStar});
Зачем вы применяете фильтр к звезде в 3 строке в течении 20 секунд, если благодаря первой строке ее через три секунды уже не будет видно.

Alexd21
25.02.2011, 00:12
По логике GC должен убить объект после зануления всех ссылок же?

to Alex21 А что вы хотели... вы за одно время генерируете звезд больше чем удаляете (при удалении первой звезды вы уже нагенерировали 10000). Естественно у вас все со временем начнет тормозить.
и еще TweenMax.to(newstar, 3, {alpha: 0, scaleX: 3, scaleY: 3, tint: currentcolor});
TweenMax.to(newstar, 3, {rotation: targetRotation, x: targetX, y: targetY});
TweenMax.to(newstar, 20, {blurFilter:{blurX:3, blurY:3}, onComplete: removeStar});
Зачем вы применяете фильтр к звезде в 3 строке в течении 20 секунд, если благодаря первой строке ее через три секунды уже не будет видно.

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

Добавлено через 9 минут
Проблема, решена!
Нужно было всего лишь создавать поменьше объектов и почаще их занулять.
Утечка памяти прекратилась, тормоза ушли.

Спасибо всем кто помогал найти решение, отдельно спасибо Aloran.

andrew911
25.02.2011, 04:13
Можно еще использовать пул объектов.

Aloran
25.02.2011, 09:57
По мне так я бы завел определенное число этих звезд и зациклил бы для каждой из них анимацию: "отработала" звездочка, отрендомил ей характеристики и снова на нее твин повесил. За счет этого у нас количество звездочек константа и нужно следить только за грамотным удалением твинов.

mayakwd
25.02.2011, 09:58
это и есть пул объектов.