Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Хранение и вывод иллюстраций для игры (http://www.flasher.ru/forum/showthread.php?t=214902)

Appleman 24.01.2018 14:26

Wolsh, спасибо.

caseyryan, спасибо. Я уже методом тыка, совмещённым со свойством nativePath, это место установил :) Туда спрайтшиты складываю. Сейчас подумываю приспособить уже имеющийся файл-менеджер для загрузки картинок.

Цитата:

загружай просто при старте игры обычным Loader'ом
Не при старте, а в рантайме нужно. Чтобы наоборот всё чохом не грузить, а каждую нужную пикчу по одной. Или я не прав?

caseyryan 25.01.2018 06:03

Цитата:

Не при старте, а в рантайме нужно. Чтобы наоборот всё чохом не грузить, а каждую нужную пикчу по одной. Или я не прав?
Всё верно. "При старте" - это и есть рантайм. Приложение запустилось, сразу загрузил всё, что нужно, показав процесс загрузки пользователю, а дальше уже используешь.
Посмотри как в старлинге устроен AssetManager. Это конечно не подойдет тебе с простым дисплей листом на 100%, но может навести на некоторые полезные мысли.
Он умеет сам определять что за вид ресурса перед ним (правда простой проверкой расширения, но в обычном случае этого достаточно, если тебе не требуется определять ресурс без расширения, чтением байт заголовков), и сам раскладывает их по нужным массивам

Appleman 25.01.2018 10:12

Цитата:

Сообщение от caseyryan (Сообщение 1203948)
"При старте" - это и есть рантайм. Приложение запустилось, сразу загрузил всё, что нужно, показав процесс загрузки пользователю, а дальше уже используешь.

Стоп. Я тогда всё-таки не понимаю. Чем такой метод лучше, чем [Embed]? Я-то думал, ничего вообще никуда не грузить на старте, а в момент, когда непосредственно требуется отобразить нужную картинку, программа обращается к ней через Loader, загружает и выводит. Когда требуется следующая, аналогично грузится она.

ZergMaster 25.01.2018 12:29

Embed вшивает ресурс в swf, увеличивая его конечный размер, например. А Loader загружает ресурс при исполнении.

undefined 25.01.2018 12:49

и в чем разница грузить большую флэшку либо грузить легкую флэшку и потом долго тянуть все ресурсы?Еще раз: грузить надо тогда,когда это требуется и только то,что требуется.

ZergMaster 25.01.2018 13:38

Ну, это зависит от задачи.. А так то да, если подгружать, потихонечку надо. Вообще картиночки можно и сразу после загрузки подгружать. Смысл в том, что флешка уже будет работать и пользователь пока может почитать че-нить, как-то уже взаимодействовать даже быть может. Пока контент грузится

caseyryan 25.01.2018 14:27

Цитата:

Сообщение от Appleman (Сообщение 1203950)
Стоп. Я тогда всё-таки не понимаю. Чем такой метод лучше, чем [Embed]? Я-то думал, ничего вообще никуда не грузить на старте, а в момент, когда непосредственно требуется отобразить нужную картинку, программа обращается к ней через Loader, загружает и выводит. Когда требуется следующая, аналогично грузится она.

1) Загрузчик грузит ресурсы асинхронно, не замораживая всю программу, а Embed сразу, всё в одном кадре. Это вызовет подвисание приложения, если ресурсов много.
2) Способом с подгрузкой ты можешь загрузить в каждый момент вермени только те ресурсы, которые требуются в данный момент. Например ты загрузил игру и игроку доступен только первый уровень. Зачем тогда ему грузить второй, третий.. десятый и т.д.
3) Загруженные ресурсы очень сильно жрут оперативку. В случае с Embed, они будут сразу все загружены и будут висеть в памяти.

Есть ещё такой момент, на некоторых операционных системах (например андроид) если приложение не ответило на запросы системы в течение какого-то времени, оно считается неактивным и убивается. Хотя такое есть и в винде, но там интервал времени ожидания больше. Embed может вызвать такое поведение.

Godwarlock 25.01.2018 16:45

caseyryan Подойдет ли вариант, с ручной деактивацией ресурсов в менеджере? Например если какой-то объект не был активен в течении длительного времени. То есть поставить таймер на такие штуки и если они долго не активны, очищаем из менеджера свойства этого объекта. А потом когда опять будет вызов, подгружать заново, ибо Null. Тогда по идее вообще память будет по минимуму нагружаться.

caseyryan 26.01.2018 06:06

Цитата:

Сообщение от Godwarlock (Сообщение 1203957)
caseyryan Подойдет ли вариант, с ручной деактивацией ресурсов в менеджере? Например если какой-то объект не был активен в течении длительного времени. То есть поставить таймер на такие штуки и если они долго не активны, очищаем из менеджера свойства этого объекта. А потом когда опять будет вызов, подгружать заново, ибо Null. Тогда по идее вообще память будет по минимуму нагружаться.

А как ты проверишь активность объекта? Вот есть у тебя какая-то BitmapData, к примеру. Как ты узнаешь используется она где-то или нет?
Или звук. Может быть это звук удара, а игрок долго никого не бьет. Как ты определишь, нужно его считать неактивным, или нет?
Ну и плюс, такое непредсказуемое поведение чревато внезапными включениями сборщика мусора, который будет подтормаживать весь процесс.

Тут главное, чтобы оптимизация не доходила до маразма. Нам (современным программистам) повезло, у нас есть в распоряжении довольно много оперативной памяти и процессорных ресурсов. Можно себе позволить не оптимизировать вообще всё и вся. Я думаю, достаточно лишь заранее условно разделить ресурсы (вручную) на те, которые могут потребоваться в данный момент, и те, которые точно не нужны здесь и сейчас. И по этому принципу всё загружать или разгружать

Appleman 06.05.2018 02:52

Друзья!

Вот что у меня получилось по части использования loader-ов. Файл находит по адресу и даже вроде как загружает. Но я никак не могу сообразить, как мне теперь его вернуть.

Код AS3:

public function getLoadedAsset(fileID: String) : Bitmap 
                {
                        var file: File = File.applicationDirectory.resolvePath("assets" + File.separator + "backgrounds" + File.separator + fileID + PNG);
                        var request: URLRequest = new URLRequest(file.url);
 
                        trace(file.url); // Показывает правильный путь
 
                        var loader: Loader = new Loader();
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
                        loader.load(request);
                        trace(loader.content); // null                       
                }
 
                private function completeHandler(e: Event) : void
                {
                        var loader: Loader = Loader(e.target.loader);
                        var image: Bitmap = Bitmap(loader.content);
                        trace(image); // [object Bitmap]
                }

То есть как мне вернуть битмапку из метода getLoadedAsset, когда она становится доступной только в методе completeHandler?


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

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