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

Anton Bel 26.04.2010 15:39

Куда девается память ?
 
Я раньше писал на С++ и привык что память нужно удалять самому. Теперь пишу на АС и не уверен в правильности работаты с памятью. Концепция Garbage Collector, хорошая, но детали ей работы не понятны. Например такой код.

Код AS3:

  var s:Sprite = new Sprite(100,100);
 // some code
  s = new Sprite(100,100);

Куда девался первый спрайт, GC удалит его из памяти или будет memory leak.

etc 26.04.2010 15:45

Удалит.

з. Ы. У спрайта нет аргументов в конструкторе.

BlooDHounD 26.04.2010 15:47

если остались ссылки, то будет утечка.
Код AS3:

var s:Sprite = new Sprite();
var s2:Sprite = s;
s = new Sprite()

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

Crenth 26.04.2010 15:58

АС3 в этом плане оч интересен. тут надо не меньше чем в сях следить за памятью.
Если не юзаете больше объект, удалите сначала все, что на него навесили, а потом сделайте объект = NULL;
Причем, перед тем, как кончать навеску, проверьте
if (объект !== NULL) { мочить все! }


а вот вам еще пример "утечки":

этот код
Код AS3:

moveTo(0,0); lineTo(0,100);
moveTo(0,0); lineTo(0,100);
moveTo(0,0); lineTo(0,100);

съест памяти втрое больше, чем этот
Код AS3:

graphics.clear();
moveTo(0,0); lineTo(0,100);
graphics.clear();
moveTo(0,0); lineTo(0,100);
graphics.clear();
moveTo(0,0); lineTo(0,100);


Anton Bel 26.04.2010 16:15

А если так

Код AS3:

var obj:Object = new Object();
obj.Img = new Sprite(100,100);
// some code
obj = new Object();

Куда уйдет Sprite ? Это ошибка ?

mickfallout 26.04.2010 16:20

если в some code ничего существенного не будет - всё нормально, ссылки не станет, объект удалится(может быть, когда-нибудь, когда GC сочтёт что так надо).

Anton Bel 26.04.2010 16:26

Ну а если так

Код AS3:

public var s:Sprite = new Sprite(100,100);
 
function SomeFunction()
{
  var s2:Sprite = s;
  s2.x = 100;
}
 
// some code
 
s = null;

Надеюсь, тоже ничего плохого не будет и память удалится.

BlooDHounD 26.04.2010 17:02

Anton Bel, откуда Вы берёте 100,100 в параметрах?

Crenth 26.04.2010 17:02

а к чему такие махинация с объявлениями экземпляров ?

можно подробнее ?

Anton Bel 26.04.2010 17:12

Это код для примера. Придумываю на ходу. Sprite тоже класс для примера, можно использовать Sprite2, если хотите.

Вопрос только об управлении памятью.

orcpochta 26.04.2010 18:23

Цитата:

Сообщение от Crenth (Сообщение 903701)
Если не юзаете больше объект, удалите сначала все, что на него навесили, а потом сделайте объект = NULL;
Причем, перед тем, как кончать навеску, проверьте
if (объект !== NULL) { мочить все! }

NULL у вас это null?
почему вы пишете именно "!==", а не "!=" - в чем тут будет отличие, или на чем вы хотели акцентировать внимание? - объясните, пожалуйста

Crenth 26.04.2010 18:30

ну это как бы ударение своего рода

автор придумывает на ходу код :)
ну вот и я подумал, что два знака равно надежнее одного :)
так сказать, вероятность того, что 1!==2 выше, чем 1!=2


на самом деле автор этой темы писал раньше на сях. а если мне не изменяет память, то АС3 null эквивалентен CPP NULL
стало быть поймет.
А != равнозначно !==, на сколько мне известно. Т.е. интеллектуальный компилятор понимает и то и другое одинаково

воспринимайте !== как акцент

orcpochta 26.04.2010 18:32

Цитата:

Сообщение от Crenth (Сообщение 903757)
ну это как бы ударение своего рода

автор придумывает на ходу код :)

ну вот и я подумал, что два знака равно надежнее одного :)

я просто спросил на всякий случай, что если чего-то не знаю))))))

Psycho Tiger 26.04.2010 18:33

Нет, в вашем примере память не убежит.
s2 умрет когда закончится выполнения метода, а s1 вы прибиваете явно.
Популяции Sprite`ов не выжить.

BlooDHounD 26.04.2010 18:43

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

Crenth 26.04.2010 18:44

Цитата:

я просто спросил на всякий случай, что если чего-то не знаю))))))
ООооо, мы так много еще не знаем.
Кстати, ЗНАНИЕ есть продукт "жизнедеятельности" интеллекта.
Т.е. если мы думаем что знаем, то скорее всего мы просто помним, обладаем информацией всего лишь.
Но чтобы ИНФОРМАЦИЯ превратилась в ЗНАНИЕ, ее надо подвергнуть анализу и синтезу


Цитата:

Crenth, хочу вас расстроить
BlooDHounD,
Код AS3:

if (1!=2) trace("Not"); else trace("But Yes!");
if (1!==2) trace("Not"); else trace("But Yes!");

в обоих случаях ответом будет NOT. не так ли ?

я просто спросил на всякий случай, что если чего-то не знаю))))))

orcpochta 26.04.2010 18:47

Цитата:

Сообщение от Crenth (Сообщение 903768)
ООооо, мы так много еще не знаем.
Кстати, ЗНАНИЕ есть продукт "жизнедеятельности" интеллекта.
Т.е. если мы думаем что знаем, то скорее всего мы просто помним, обладаем информацией всего лишь.
Но чтобы ИНФОРМАЦИЯ превратилась в ЗНАНИЕ, ее надо подвергнуть анализу и синтезу

вы загоняетесь не о том
естественно я очень много не знаю - потому и задал вам тот вопрос, меня смутило, что в AS3 нет NULL и ваше использование !==

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

Crenth 26.04.2010 18:50

да, пожалуй

i.o. 26.04.2010 18:54

Цитата:

почему вы пишете именно "!==", а не "!=" - в чем тут будет отличие
А в том, что при == или != будет происходить приведение типов, а === или !== вернет true, только если сравниваемые типы переменных равны и их значения.
Код AS3:

var a:* = "1";
var b:* = 1;
 
 
trace( Boolean(a == b) );
trace( Boolean(a != b) );
 
trace( Boolean(a === b) );
trace( Boolean(a !== b) );
 
 
 
var i:int;
var l:int = 10*1000*1000;
var b_res:Boolean;
 
var tm_idle:uint;
var tm_sEq:uint;
var tm_sNEq:uint;
var tm_pEq:uint;
var tm_pNEq:uint;
 
 
tm_idle = getTimer();
i = -1;
while( ++i < l )
{
        b_res = true;
}
tm_idle = getTimer() - tm_idle;
 
 
tm_sEq = getTimer();
i = -1;
while( ++i < l )
{
        b_res = Boolean(a == b);
}
tm_sEq = getTimer() - tm_sEq;
 
 
tm_sNEq = getTimer();
i = -1;
while( ++i < l )
{
        b_res = Boolean(a != b);
}
tm_sNEq = getTimer() - tm_sNEq;
 
 
 
tm_pEq = getTimer();
i = -1;
while( ++i < l )
{
        b_res = Boolean(a === b);
}
tm_pEq = getTimer() - tm_pEq;
 
 
tm_pNEq = getTimer();
i = -1;
while( ++i < l )
{
        b_res = Boolean(a !== b);
}
tm_pNEq = getTimer() - tm_pNEq;
 
 
 
trace( "idle time: " + tm_idle + " ms" );
trace( "'==' time: " + tm_sEq + " ms" );
trace( "'!=' time: " + tm_sNEq + " ms" );
trace( "'===' time: " + tm_pEq + " ms" );
trace( "'!==' time: " + tm_pNEq + " ms" );
 
// РЕЗУЛЬТАТЫ:
true
false
false
true
idle time: 63 ms
'==' time: 1638 ms
'!=' time: 1601 ms
'===' time: 522 ms
'!==' time: 513 ms


mickfallout 26.04.2010 18:55

Цитата:

Сообщение от Crenth (Сообщение 903768)
BlooDHounD,
Код AS3:

if (1!=2) trace("Not"); else trace("But Yes!");
if (1!==2) trace("Not"); else trace("But Yes!");


Я думаю речь например о
Код AS3:

var a:*= null;
var b:*= undefined;
trace(a != b);//false
trace(a !== b);//true


Psycho Tiger 26.04.2010 18:56

Crenth, если вы спросите у ребёнка, показав на системный блок он скажет, что это коробка и показав на картонную коробку он тоже скажет что это коробка. После этого вы станете утверждать, что у них одно и то же предназначение - для перевозки вещей/хранения микросхем или попробуете узнать побольше?
А теперь вопрос не риторический. Как вы думаете, зачем ввели два оператора (!=, !==), если они делают одно и то же?

Crenth 26.04.2010 19:04

В результате анализа и синтеза я пришел к выводу,
что директива != и !==
одинаково корректно работает, когда слева ссылка на объект, а справа null

когда я уничтожаю объект,
пишу
Код AS3:

if (myObject!=null) 
{
 myObject.removeEventListener(..........);
 myObject=null;
}

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


Я в АС3 новичок. До сих пор не могу взять в толк, почему для передачи 2-х байт chunk_size в протоколе RTMP Адобы используют 4 байта :)

i.o. 26.04.2010 19:06

Цитата:

Возвращаю вас к разговору об утечках памяти
существует флексовый профайлер для их обнаружений

Psycho Tiger 26.04.2010 19:14

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

Crenth 26.04.2010 19:16

в помощь автору темы

http://help.adobe.com/en_US/OSMF/1.0...x-Symbols.html

пошел завтракать :)

tkaChuck 27.04.2010 09:20

http://dtf.ru/articles/read.php?id=51967
вот это я прочитал и на меня снизошло просветление.

orcpochta 27.04.2010 12:44

Цитата:

Сообщение от tkaChuck (Сообщение 903961)
http://dtf.ru/articles/read.php?id=51967
вот это я прочитал и на меня снизошло просветление.

объясните мне кто-нибудь вот эти строки из ссылки:
Цитата:

Во-первых, приложения базирующиеся на Flex SDK имеют очень низкую производительность в плане визуализации, однако предоставляют довольно удобный набор компонент для быстрого создания бизнес-приложений. В свою очередь, Flash CS SDK обладает высокой производительностью в плане визуализации, однако предоставляет довольно бедный набор визуальных компонент. Существуют различные хитрости и методы оптимизации процесса визуализации Flex SDK приложений, однако их описания не будет в рамках данной статьи.
Тут сказано, что игры, требовательные к производительности, нужно писать в Flash CS3 и CS4, но никак не в флексовых SDK? Или я чего-то не понял? Разжуйте, пожалуйста подробно, кто сведущ в этом вопросе)))

iflamberg 27.04.2010 13:04

2orcpochta: Это человек не отличает flex framework от flex sdk. Имеется вввиду, что писать игрушки в flex framework неудачная затея - потому что он тяжелый и медлительный.

BlooDHounD 27.04.2010 13:19

там сказано, что автор статьи ничего не понимает в разработке на Flash Platform.

iflamberg 27.04.2010 13:47

А вы видели этот класс из статьи: MemoryController.as? Оно вообще работает?

Aloran 27.04.2010 14:19

Цитата:

Сообщение от Crenth (Сообщение 903781)
В результате анализа и синтеза я пришел к выводу,
что директива != и !==
одинаково корректно работает, когда слева ссылка на объект, а справа null

Зачем так загоняться когда можно просто (и быстрее) сделать так (при проверке на null):
Код AS3:

if (myObject) 
{
 myObject.removeEventListener(..........);
 myObject=null;
}


Волгоградец 27.04.2010 14:20

Ну, с LocalConnection() - известный факт. А вот doSimpleClean() у меня вызывает сомнения - я не вижу причины чтобы этот метод вызвал gc.

BlooDHounD 27.04.2010 14:45

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

iflamberg 27.04.2010 14:53

а фишка с LocalConnection разве работает не в debug-версии?

Волгоградец 27.04.2010 15:08

Работает.
Да и смысл в дебаговом такую муть делать - там есть родной System.gc().

iflamberg 27.04.2010 15:44

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

BlooDHounD 27.04.2010 16:21

iflamberg, объясните пожалуйста связь gc и прямых ссылок?

p.s.: а принудительно вызывать gc на самом деле очень мало смысла.

orcpochta 27.04.2010 16:28

а диспозить битмэпы, когда удаляешь их содержащие объекты - это ересь?))

BlooDHounD 27.04.2010 16:31

как это к gc относится?

orcpochta 27.04.2010 16:33

нет, но это тоже косвенно касается очистки памяти


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

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