Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.06.2018, 03:04
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 21  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
Массив вышел из стека и продолжает "висеть в памяти, дожидаясь сборщика".

Старый 14.06.2018, 03:52
RedHead90 вне форума Посмотреть профиль Отправить личное сообщение для RedHead90 Найти все сообщения от RedHead90
  № 22  
Ответить с цитированием
RedHead90

Регистрация: Apr 2018
Сообщений: 42
robotR2D2, ну во-первых ты массив конвертируешь в строку, о чем тут выше уже писали, во-вторых у тебя вообще ничего из стека не выходит и этот код показывает лишь то, что спрайт остается висеть в памяти. Судьба вектора и массива остается при этом неизвестной. Но твой пост заставил меня задуматься о том, что либо все объекты остаются ждать сборщика, либо это только объекты отображения ведут себя как-то иначе.

В общем взял Scout и скормил ему такой код

Код AS3:
package {
import flash.display.Sprite;
 
public class Main extends Sprite {
 
    public var v:Vector.<Sprite>;
 
    public function Main() {
        super();
 
        for (var i:int = 0; i < 10000; ++i) {
            v = Vector.<Sprite>([new Sprite()]);
        }
    }
}
}
Как и ожидалось, в первом же кадре были освобождены все 10к массивов. Векторов освобождено 9998, а вот спрайтов всего 2.5к. Остальные 7.5к были собраны сборщиком после нажатия соответствующей кнопочки в скауте.


Последний раз редактировалось RedHead90; 14.06.2018 в 04:04.
Старый 14.06.2018, 05:00
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 23  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
да, строку откуда-то копировал с этой темы. "new" лишний. Удивлен, что AIR не выдал никаких ошибок.
Тем не менее, исправленный код дает тот же результат.
Суть в том, что у массива есть ссылка на sprite, что испускает события. Ни на массив, ни на sprite больше ссылок нет. Стало быть, удаляя массив GC должен был удалить и sprite, спамящий EF.
Что касается удаления не всех объектов - GC начинает чистить память, когда скапливается некая критическая масса использованной памяти. Почему удаление частичное - сложно сказать. Возможно, автоматическое удаление имеет лимит по соотношению нагрузка от GC / результат. A System.gс() приказывает работать до упора.

Старый 14.06.2018, 08:55
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 24  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Ни на массив, ни на sprite больше ссылок нет. Стало быть, удаляя массив GC должен был удалить и sprite, спамящий EF.
А вектор, который ты пытался создать из массива, будет хранить ссылку на какой-то другой спрайт что ли? Сама идея со слушателем была неверна.
__________________
Reality.getBounds(this);

Старый 14.06.2018, 16:10
robotR2D2 вне форума Посмотреть профиль Отправить личное сообщение для robotR2D2 Найти все сообщения от robotR2D2
  № 25  
Ответить с цитированием
robotR2D2

Регистрация: May 2016
Сообщений: 25
Цитата:
А вектор, который ты пытался создать из массива, будет хранить ссылку на какой-то другой спрайт что ли?
да, он тоже хранит ссылку на него. Но он так же создавался в теле метода и на на него нет ссылок.
Цитата:
Сама идея со слушателем была неверна.
Почему?

Старый 14.06.2018, 19:49
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 26  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Но он так же создавался в теле метода и на на него нет ссылок.
А, даже так.. (я смотрел на код RedHead90))
Цитата:
Почему?
Потому что существование спрайта все-равно не доказало бы существование массива.
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:16.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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