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

Вернуться   Форум Flasher.ru > Блоги > toFL

Оценить эту запись

ОЗУ и XML

Запись от toFL размещена 03.04.2014 в 15:45

Привет, постараюсь кратко.

О чем:

Проблема заключается в чрезмерном потреблении памяти при работе с XML структурами.

Особенности класса:
  • Объект XML не содержит в себе строк. Он занимает в памяти 24 byte, не зависимо от его длины.
  • При обращении к его методам поиска, временно выделяется память на хранение новых структур (Например XMLList и др.)
Следовательно чем сложнее XML и поиск его элементов, тем больше потребляется памяти. Стоит отметить, что эта память будет освобождена после выполнения функции.

Пример поиска детей:

Забиваем XML
Код AS3:
var myxml:XML = new XML(<root/>);
var node:XML = <node a="1" b="2" c="3"/>;
var i:int = 0;
while (i++ < 100)
	myxml.appendChild(node);
trace(getSize(myxml));//24 byte
Тестируем
Код AS3:
myxml.node;//480 byte;
Memory Allocations:
  • XMLList (< 1Kb)

Пример поиска атрибутов:

Получаем список детей:
Код AS3:
var nodes:XMLList = myxml.node;//480 byte
Тестируем attribute:
Код AS3:
var i:int = 0;
while (i++ < 100)//12 Kb
	nodes.attribute("a");//122 byte
Memory Allocations:
  • XMLList (7 Kb)
  • QName (3 Kb)
  • Namespace (2 Kb)

Тестируем @:
Код AS3:
var i:int = 0;
while (i++ < 100)//7 Kb
	nodes.@a;//71 byte
Memory Allocations:
  • XMLList (7 Kb)

Личный опыт:

Например в Starling при парсинге xml-лей для TextureAtlas и BitmapFont (и других) в одном кадре может выделится дополнительных до 15Mb. После этой новости я конечно переписал эти функции (Привет Daniel-ю). Когда дело доходит до не самых новых устройств эти несколько лишних метров могут привести к падению. На iPhone4 например приложению доступно всего 100Mb (Видео память - это просто кусок оперативки), по-этому каждый метр на счету . Как вариант можно конвертнуть xml в json. При работе с ним выделяется в разы меньше памяти. Оно и понятно, создается готовый Object, который все хранит внутри себя.

Выводы:
  • Минимизировать поиск детей в циклах
  • Вместо node.attribute("a") использовать node.@a
  • По возможности заменить xml на json

P.S.
Кстати ещё один плюс таких оптимизаций - это производительность, т.к. копирование памяти тоже тяжелая операция. Если кому-нибудь интересно, могу написать статью о работе с ОЗУ на разных желесках и сравнительные тесты с C++ и Objective-C, ассемблерные вставки вместо memcpy и другое.
Всего комментариев 14

Комментарии

Старый 03.04.2014 18:36 Babylon вне форума
Babylon
 
Аватар для Babylon
Спасибо большое!!!
Старый 03.04.2014 19:40 ChuwY вне форума
ChuwY
 
Аватар для ChuwY
Жду следующую статью!
Старый 03.04.2014 22:22 dimarik вне форума
dimarik
 
Аватар для dimarik
Я переписал starling на XMLDocument и дышать стало легче. Когда-нибудь я сделаю атлас на amf. Но не завтра.
Старый 04.04.2014 04:11 in4core вне форума
in4core
 
Аватар для in4core
dimarik - когда нибудь мир станет добрее...
Старый 04.04.2014 09:22 dimarik вне форума
dimarik
 
Аватар для dimarik
Ничего личного, бро. Just for fun.
Старый 04.04.2014 13:47 Котяра вне форума
Котяра
 
Аватар для Котяра
> Когда-нибудь я сделаю атлас на amf
Я так и сделал. атлас/атласы вместе с описанием лежат в amf
https://bitbucket.org/k0t0vich/arp/s....as?at=default
доставание ресурсов немного кривоватое, но что есть.
https://bitbucket.org/k0t0vich/arp/s....as?at=default
Старый 04.04.2014 14:30 toFL вне форума
toFL
Цитата:
// почему то не сериализуется вектор байтареев
Сериализуются только Vector.<Object> (даже Vector.<String> не выйдет)
Старый 04.04.2014 14:37 toFL вне форума
toFL
Цитата:
Rasterizer.as
Там дико не хватает вычисления Rectangle с учетом всех вложенных фильтров в MovieClip/Sprite. Если что, могу подогнать.
Старый 04.04.2014 14:39 toFL вне форума
toFL
Цитата:
доставание ресурсов немного кривоватое, но что есть.
Кстати всем на заметку, на Android файл с ресурсами открывайте на старте приложения и никогда не закрывайте. Ибо на Android время открытия файлов около 200 ms. Если файл > 100 Mb, то время в секундах.
Старый 04.04.2014 14:59 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Сериализуются только Vector.<Object> (даже Vector.<String> не выйдет)
Это не так
Код AS3:
public var regions:Vector.<Region>;
Нормально сериализуется, только Region тоже описан как
Код AS3:
[RemoteClass (alias="arp.remote.Region")]
можно попробовать добавить самому
ByteArray как
Код AS3:
registerClassAlias ("flash.utils.ByteArray", ByteArray);
но я обошелся обычным массивом.
Старый 04.04.2014 15:00 Котяра вне форума
Котяра
 
Аватар для Котяра
Цитата:
Там дико не хватает вычисления Rectangle с учетом всех вложенных фильтров в MovieClip/Sprite. Если что, могу подогнать.
Напиши мне в личку или пуллреквест на битбакет. Просто мне в моём проекте не нужно было.
Старый 05.04.2014 00:21 toFL вне форума
toFL
Цитата:
Нормально сериализуется, только Region тоже описан как
Значит бага в AIR именно с Vector.<String>. У меня он его сериализует, но только как Vector.<Object>.
Старый 05.04.2014 00:30 toFL вне форума
toFL
Цитата:
Напиши мне в личку
Кинул тебе в паблик.
Старый 02.07.2014 00:39 toFL вне форума
toFL
Кстати Daniel в Starling таки сделал недавно commit с моими правками по работе с атрибутами XML, работа проделана не зря
 
Последние записи от toFL

 


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


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