Развитие игровой вспышки
Текущее время: Чт апр 26, 2018 6:01 am

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Чт окт 15, 2015 5:15 pm 
Не в сети

Зарегистрирован: Ср сен 21, 2011 1:18 pm
Сообщений: 81
Вдруг кому-то сбережет время и нервы.

Грузил я себе в flash приложение мелкие картинки на старте и кэшировал их для быстрого доступа по потребности. Схема обычная: грузим Loader'ом, получаем BitmapData, сохраняем её в кэш, убираем мусор. Набор картинок ожидаемо увеличивал размер занимаемой флешкой памяти на общий объем их BitmapData. При этом можно было выбирать, откуда сами картинки грузятся: для браузера - с сервера, для локального варианта флешки - с диска.

Задумавшись на днях про мобильную версию, решил использовать File.applicationStorageDirectory для хранения ресурсов, дабы клиенту каждый раз не приходилось тянуть их с сервера. Нарисовал код, качающий и сохраняющих нужный контент, и выставил значение своей настройки imagesRoot в File.applicationStorageDirectory.resolvePath( "content" ).url. Ссылки на файлы для URLRequest приняли вид "app-storage:/content/image.png", как и положено. И всё даже заработало. Всё еще можно было выбирать - брать контент во время работы приложения по сети или локально, с устройства.

Проблема стряслась ровно одна: набор одних и те же картинок, загружаясь и кэшируясь одним и тем же Loader'ом на мобильном устройстве (и на десктопе, кстати, тоже) прилетая по HTTP (http://www.example.com/image.png) расходовали прежний 1Мб памяти, а считываясь из applicationStorageDirectory (app-storage:/content/image.png) расходовали 300+Мб памяти. Это было ОЧЕНЬ печально.

В конце концов нашел решение: если вместо приятного "app-storage:/content/image.png" указать адрес для загрузки в явном виде "file:////data/data/air.air.HLAIR/air.HLAIR/Local Store/content/image.png", то всё станет как должно быть: "один мегабайт кэшированой битмапдаты тратит один мегабайт памяти".

Остались, однако, вопросы:
1. Чьи это грабли: мои или AIR?
2. Сталкивался ли кто-то еще с подобным и как решил, если сталкивался?


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Сб окт 31, 2015 10:25 am 
Не в сети
Аватар пользователя

Зарегистрирован: Вс дек 19, 2010 5:31 pm
Сообщений: 4974
Откуда: Пока не знаю
Сайт: http://gamespoweredby.com/blog/
Сделай минимальный юзеркейс. Да и вообще для мобилы использовать URLLoader для локальной загрузки..


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Пн ноя 02, 2015 2:24 pm 
Не в сети

Зарегистрирован: Ср сен 21, 2011 1:18 pm
Сообщений: 81
TheRabbit писал(а):
Сделай минимальный юзеркейс.
Попробую.
TheRabbit писал(а):
Да и вообще для мобилы использовать URLLoader для локальной загрузки..
Там на самом деле Loader.
А причина в туче уже давно имеющегося и развивающегося кода для браузерной версии, которую хотелось бы, не переписывая с нуля, попытаться адаптировать для мобильных устройств. Причем, не порождая два разные ветки.
Пока, вроде бы, кое-что получается. Без старлинга всё не так хорошо, как хотелось бы, но кто ж знал на старте-то.


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Пн ноя 02, 2015 3:42 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Вс дек 19, 2010 5:31 pm
Сообщений: 4974
Откуда: Пока не знаю
Сайт: http://gamespoweredby.com/blog/
Делать 2 ветки вовсе не обязательно. Можно создать класс-обертку и через тупой find & replace заменить везде импорты класса на свою обертку. В а обертке уже работать со всем как положено.


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Пн ноя 02, 2015 5:30 pm 
Не в сети

Зарегистрирован: Ср сен 21, 2011 1:18 pm
Сообщений: 81
TheRabbit писал(а):
Делать 2 ветки вовсе не обязательно. Можно создать класс-обертку и через тупой find & replace заменить везде импорты класса на свою обертку. В а обертке уже работать со всем как положено.
Да, хороший вариант, спасибо. Я пока обхожусь условной компиляцией, где надо.
А насколько, кстати, лучше тот же FileStream, чем Loader?


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Пн ноя 02, 2015 5:34 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Вс дек 19, 2010 5:31 pm
Сообщений: 4974
Откуда: Пока не знаю
Сайт: http://gamespoweredby.com/blog/
Смотря что делать. FileStream он загружает с диска в качестве массива байтов файлы. А Loader- только для медиа. Но еще и декодирует.
Нет тут "правильно" и "не правильно". Есть случаи, когда одно згружает в память и создает объект не выгружая его источник. И есть случай, когда файл после загрузки может быть прибит.

После минимального примера можно будет о чем-то конкретнее говорить. Пока мне не ясно что выгораживать. Loader или File + loadBytes


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Вт ноя 03, 2015 12:09 pm 
Не в сети

Зарегистрирован: Ср сен 21, 2011 1:18 pm
Сообщений: 81
TheRabbit писал(а):
Смотря что делать. FileStream он загружает с диска в качестве массива байтов файлы. А Loader- только для медиа. Но еще и декодирует.
Делать-то нужно простое: загрузить в самодельный кэш битмадаты для последующего синхронного доступа к ним по потребности.
TheRabbit писал(а):
Есть случаи, когда одно згружает в память и создает объект не выгружая его источник. И есть случай, когда файл после загрузки может быть прибит.
Вроде бы (вроде бы) источник как раз выгружается после того, как я забираю его битмапдату в случае с "file:///..." и не выгружается в случае с "app-storage:/..."

Не могу воспроизвести проблему на примере одной картинки.
Либо я таки ошибся и на проблему повлияла не замена "app-storage:/..." на "file:///...", либо надо конструировать пример с очередью, как в оригинальном коде.


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Вт ноя 03, 2015 12:37 pm 
Не в сети
Аватар пользователя

Зарегистрирован: Вс дек 19, 2010 5:31 pm
Сообщений: 4974
Откуда: Пока не знаю
Сайт: http://gamespoweredby.com/blog/
у тебя вообще не должно возникать никаких app-storage и file:///

Код:
import flash.filesystem.File;
import flash.events.Event;
import flash.filesystem.FileStream;
import flash.filesystem.FileMode;
import flash.utils.ByteArray;
import flash.display.Loader;
import flash.system.System;


var imageFile :File = File.documentsDirectory.resolvePath("file.jpg");
var imageBytes : ByteArray = new ByteArray();
var fileStream : FileStream = new FileStream();
fileStream.open(imageFile, FileMode.READ);
fileStream.readBytes(imageBytes);
fileStream.close();
fileStream = null;
imageFile = null;
var ldr : Loader = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, ldrComplete);
function ldrComplete(e:Event):void{
   ldr.contentLoaderInfo.removeEventListener(Event.COMPLETE, ldrComplete);
   addChild(ldr);
   imageBytes.clear();
   imageBytes = null;
}
ldr.loadBytes(imageBytes);





Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Вт ноя 03, 2015 3:35 pm 
Не в сети

Зарегистрирован: Ср сен 21, 2011 1:18 pm
Сообщений: 81
Так-то оно понятно. Но я даю игрокам возможность выбирать: откуда тянуть контент - с сервера или с устройства, предварительно его туда загрузив. Сейчас это разруливается путями. Либо "http://...", либо "file:///" при одинаковых именах файлов одним и тем же кодом. Наследие еще с обычной flash-версии, которая есть для браузера или в виде локального клиента.
Конечно можно эту бифуркацию вынести выше и для локальной загрузки как раз сделать то, что ты написал. Хотя сейчас Loader с URLRequest'ом вроде нормально справляются. Но только если в URLRequest'е пути указывать не как "app-storage:/", а как "file:///".


Вернуться наверх
 Профиль Отправить e-mail  
 
 Заголовок сообщения: Re: Loader( ) и "app-storage:" как URI-схема
СообщениеДобавлено: Пт ноя 13, 2015 4:37 pm 
Не в сети

Зарегистрирован: Ср сен 21, 2011 1:18 pm
Сообщений: 81
Таки пришлось для локальных данных реализовать схему FileStream.readBytes( ) + Loader.loadBytes( ) , ибо она оказалась катастрофически быстрее, чем Loader.load( ) для одних и тех же файлов.

Заодно открыл для себя, что грузить в память разные справочники в виде XML (для произвольного поиска) на мобилках - непозволительная роскошь. Уже на не самых больших размерах, миллисекунды на один поиск превращаются в десятки миллисекунд, что в циклах дает заметные задержки.


Вернуться наверх
 Профиль Отправить e-mail  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB