|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Jul 2007
Сообщений: 159
|
Масксимально быстрая загрузка из Zip
Привет. Имеется старлинг приложение, которое загружает упакованные в zip (без сжатия) ресурсы через ZipFile (от nochump) и из него получает битмапы через loadBytes для последующего конвертирования в текстуры.
var data:ByteArray = zipFile.getInput(zipFile.getEntry('имя_файла')); loader.loadBytes(data); Если же в цикле всю экстракцию инициировать - занимает 3 секунды, но вешает намертво приложение на это время (анимация в прелоадере фризится). Основное время занимает конечно zipFile.getInput(zipFile.getEntry('имя_файла')), loadBytes и последующее создание битмапов проходит значительно быстрее. С архивами в as3 до этого работать не приходилось, но хочется и быстро, и без фризов Возможно, посоветуете какие библиотеки для работы с zip, более производительные и удобные?
__________________
Думаю на as3. Готов к долгосрочному взаимовыгодному сотрудничеству в сфере геймдева. Последний раз редактировалось morgenshtern; 07.02.2014 в 11:31. |
|
|||||
Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
|
Вряд-ли время распаковки получится сильно сократить.
Попробуйте искать библиотеки, которые написаны на c/c++ и портированы на флеш через alchemy. 3 секунды - время небольшое. Можно попробовать вынести распаковку в фоновый воркер, тогда фризов интерфейса не будет. |
|
|||||
Регистрация: Jul 2007
Сообщений: 159
|
Так вот и хотелось узнать результаты сравнительных бэнчмарков разных либ
Архив то у меня без сжатия, почему так долго то. Возможно стоит смотреть в сторону хранения/извлечения пнгшек из sfw?
__________________
Думаю на as3. Готов к долгосрочному взаимовыгодному сотрудничеству в сфере геймдева. |
|
|||||
Воркеры это вообще лажа ужасная. Как я понял, адоби на них забили частично, и вряд ли удастся комфортно разрабатывать что-то с воркерами.
Недавно сталкивался с такой же проблемой, и решил ее без воркеров. Распаковка стала чуть дольше, зато приложение не вешает совершенно, и все анимации будут работать. В общем, суть в том, чтобы распаковку делать не в цикле, и покадрово и или по таймеру В общем, вот такой класс набросал package { import flash.events.Event; import flash.events.EventDispatcher; import flash.events.TimerEvent; import flash.utils.ByteArray; import flash.utils.Timer; import nochump.util.zip.ZipEntry; import nochump.util.zip.ZipFile; public class ZipUnpacker extends EventDispatcher { private var _iter: int = 0; private var _totalEntries: int = 0; private var _zipEntries: Array/*ZipEntry*/ = null; private var _timer: Timer = null; private var _zipFile: ZipFile = null; private var _byteArrays: Array/*ByteArray*/ = []; public function ZipUnpacker(zipFile:ZipFile) { _zipFile = zipFile; _zipEntries = _zipFile.entries; _totalEntries = _zipEntries.length; } public function unpack():void { _timer = new Timer(12, _zipEntries.length +1); _timer.addEventListener(TimerEvent.TIMER, onTimer); _timer.start(); } private function onTimer(e:TimerEvent):void { // за один тик распаковываем 10 входов, если надо по одному, то просто убираем цикл for (var i:int = 0; i < 10; i++) { var percent: int = (_iter / _totalEntries) * 100; //trace(percent); // тут можно процент распаковки показывать var entry: ZipEntry = _zipEntries[_iter]; var name: String = entry.name; var byteArray: ByteArray = _zipFile.getInput(entry); var indexOfDot: int = name.lastIndexOf("."); if (indexOfDot > -1) { // значит в названии есть расширение var indexOfSlash: int = name.lastIndexOf("/") + 1; var fileName: String = name.substr(indexOfSlash, indexOfDot - indexOfSlash); } if (byteArray.bytesAvailable > 0) { _byteArrays.push(byteArray); } _iter++; if (_iter >= _totalEntries) { _timer.reset(); _timer.removeEventListener(TimerEvent.TIMER, onTimer); _timer = null; dispatchEvent(new Event(Event.COMPLETE)); break; } } } } } Распаковывает он все это в байт массивы и помещает в массив. Естественно, в таком виде их вряд ли используешь, поэтому тут уж дальше кому что надо. У меня есть специальный класс обертка, в котором массив превращается в картинку через Loader.loadBytes() так же в этом классе хранится название ввода из архива, чтобы как-то это потом идентифицировать Работает все так: |
|
|||||
Регистрация: Jul 2007
Сообщений: 159
|
Спасибо, как раз начал писать распаковку пачками.
Все сразу - быстро, но вешает приложение, по одному - нереально долго. Пачки наверное в самый раз будут Добавлено через 36 минут Мде... Проблем вовсе не в коде или тормозной либе Тотал перепаковывает архив при изменении его содержимого, добавляет 2% сжатия Перепаковал заново без сжатия винраром - время распаковки 70 мс в цикле и 380 пачками по 10. Кстати, с "обычным" сжатием то же самое извлекается почти 9000 мс...
__________________
Думаю на as3. Готов к долгосрочному взаимовыгодному сотрудничеству в сфере геймдева. |
Часовой пояс GMT +4, время: 11:07. |
|
« Предыдущая тема | Следующая тема » |
Теги |
Starling , zip , оптимизация |
|
|