![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 111
|
2WGR
Просто как странно, что свойство length по сути почти ни о чем не говорит. |
|
|||||
|
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Да, так и правда всё встаёт на свои места.
А почему бы не попробовать использовать Vector? Это, вроде бы, уплотнённый массив, так что с ним таких проблем быть не должно... И всё равно, если в нём будут храниться не числа/строки, а что-либо более структурное, то без вызова GC не обойтись... |
|
|||||
|
Регистрация: 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);
}
}
}
Это что же получается - работаешь с массивом не добавляя в него новых элементов, а он потихоньку сжирает память непонятно куда Знатоки as3 объясните в чем дело? Кстати если тип всех элементов int, то все нормально. Последний раз редактировалось mikleb; 28.11.2008 в 04:03. |
|
|||||
|
Регистрация: Nov 2008
Сообщений: 65
|
Судя по тестам, флеш оптимизирует хранение простых типов внутри массивов (если в массив сохранять только int, то размер 4 байта на ячейку массива!!!). А вот если сохранять Number, то флеш его сначала обволакивает в объект, и хранит ссылки на эти объекты (в итоге 8 байт double + 4 байт ссылка (на 32бит) ). При присваивании нового значения, если тип неизвестен, то он заново создает объекты оболочки, а старые удаляет (при этом не все, по ходу, оптимизирует для повторного использования, хотя судя по всему, тупо глючит).
System.gc() при этом действительно не помогает - объекты оболочки хранятся в обход сборщика мусора (видимо для уменьшения нагрузки на него). Чтобы убрать такой эффект, необходимо исправить на: 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); } } } Последний раз редактировалось ZlPredator; 28.11.2008 в 10:16. |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 111
|
Все равно память пропадает непонятно куда, пусть и не в таких количествах. Может дело в компиляторе... Странно что тема малоактивна - потому что это серьезный глюк плеера (или может компилятора)
Последний раз редактировалось mikleb; 29.11.2008 в 02:37. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Никуда она не пропадает, просто GC крайне ленивый.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 02:53. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|