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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.11.2008, 18:41
mikleb вне форума Посмотреть профиль Отправить личное сообщение для mikleb Найти все сообщения от mikleb
  № 11  
Ответить с цитированием
mikleb

Регистрация: Feb 2008
Сообщений: 111
2WGR
Просто как странно, что свойство length по сути почти ни о чем не говорит.

Старый 27.11.2008, 18:50
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 12  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Да, так и правда всё встаёт на свои места.
А почему бы не попробовать использовать Vector? Это, вроде бы, уплотнённый массив, так что с ним таких проблем быть не должно... И всё равно, если в нём будут храниться не числа/строки, а что-либо более структурное, то без вызова GC не обойтись...

Старый 28.11.2008, 03:33
mikleb вне форума Посмотреть профиль Отправить личное сообщение для mikleb Найти все сообщения от mikleb
  № 13  
Ответить с цитированием
mikleb

Регистрация: Feb 2008
Сообщений: 111
УЖАС!!!!
Код:
package
{
	import flash.display.Sprite;
	import flash.system.System;

	public class Main extends flash.display.Sprite
	{
		private var d:Array
	
		public function Main():void
		{
			var n:int = 10000000, i:int;
			
			d = new Array();
			trace(System.totalMemory);
		
			for (i = 0; i < n; ++i)
				d[i] = 0.123;
			trace(System.totalMemory);
			
			
			for (i = 0; i < n; ++i)
				d[i] = d[i] + d[i] + d[i] + d[i];
			trace(System.totalMemory);
			
		}
	}
}
После второго цикла используется в два раза больше памяти! Причем gc ее не освобождает (проверял отдельно)
Это что же получается - работаешь с массивом не добавляя в него новых элементов, а он потихоньку сжирает память непонятно куда
Знатоки as3 объясните в чем дело?

Кстати если тип всех элементов int, то все нормально.


Последний раз редактировалось mikleb; 28.11.2008 в 04:03.
Старый 28.11.2008, 07:07
ZlPredator вне форума Посмотреть профиль Отправить личное сообщение для ZlPredator Найти все сообщения от ZlPredator
  № 14  
Ответить с цитированием
ZlPredator

Регистрация: Nov 2008
Сообщений: 65
Судя по тестам, флеш оптимизирует хранение простых типов внутри массивов (если в массив сохранять только int, то размер 4 байта на ячейку массива!!!). А вот если сохранять Number, то флеш его сначала обволакивает в объект, и хранит ссылки на эти объекты (в итоге 8 байт double + 4 байт ссылка (на 32бит) ). При присваивании нового значения, если тип неизвестен, то он заново создает объекты оболочки, а старые удаляет (при этом не все, по ходу, оптимизирует для повторного использования, хотя судя по всему, тупо глючит).
System.gc() при этом действительно не помогает - объекты оболочки хранятся в обход сборщика мусора (видимо для уменьшения нагрузки на него).

Чтобы убрать такой эффект, необходимо исправить на:

Код AS3:
package
{
	import flash.display.Sprite;
	import flash.system.System;
 
	public class Main extends flash.display.Sprite
	{
		private var d:Array
 
		public function Main():void
		{
			var n:int = 10000000, i:int;
 
			d = new Array();
			trace(System.totalMemory);
 
			for (i = 0; i < n; ++i)
				d[i] = 0.123;
			trace(System.totalMemory);
 
 
			for (i = 0; i < n; ++i)
				d[i] = Number(d[i]) + Number(d[i]) + Number(d[i]) + Number(d[i]);
			trace(System.totalMemory);
 
		}
	}
}
Тогда компилятор знает тип и не создаёт заново оболочки ( временные скачки по памяти убираются System.gc() или со временем)


Последний раз редактировалось ZlPredator; 28.11.2008 в 10:16.
Старый 29.11.2008, 02:34
mikleb вне форума Посмотреть профиль Отправить личное сообщение для mikleb Найти все сообщения от mikleb
  № 15  
Ответить с цитированием
mikleb

Регистрация: Feb 2008
Сообщений: 111
Все равно память пропадает непонятно куда, пусть и не в таких количествах. Может дело в компиляторе... Странно что тема малоактивна - потому что это серьезный глюк плеера (или может компилятора)


Последний раз редактировалось mikleb; 29.11.2008 в 02:37.
Старый 29.11.2008, 12:17
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 16  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Никуда она не пропадает, просто GC крайне ленивый.

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

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

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


 


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


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