Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Библиотека SWC или [Embed(source...? (http://www.flasher.ru/forum/showthread.php?t=179197)

RJ Presto 29.05.2012 13:31

Цитата:

Сообщение от in4core (Сообщение 1081890)
на каком диске? У вас объект создался ( в поле класса ). Все. у вас готовый объект который ниче не делает и память не нагружает собственно.
bitmapData.applyFilter() - ага а тут мы уже память потревожим. addChild(bitmap) , bitmap.bitmapData.doSome() - ага а тут мы тревожим сильнее потому что еще и визуально ее рендерим

а как вы себе представляете вот этот готовый объект, который в памяти ничего не занимает?
вот, плеер, запомни - мы тут инстанс битмапы как бы создали, но ты память под него не выделяй, пока никто не обратится
так что ли?

Simplifier 29.05.2012 18:04

Цитата:

Сообщение от TanaTiX (Сообщение 1081940)
zuxul, а где про это можно почитать? Поделись ссылкой.

http://help.adobe.com/ru_RU/as3/mobi...7189-7ff9.html

PlutDem 29.05.2012 19:17

Чего то дискуссия свернула куда то не туда. Как в разные промежутки времени создавать битмапы ссылающиеся на одну BitmapData? Т.е. насоздовали битмап и забыли про это, затем понадобилось еще несколько таких же битпап, но где взять ссылку на BitmapData первой группы? Сначала подумал, что можно было бы создать класс в котором бы хранились все ссылки на BitmapData если они используются. В геттере проверяли бы существует ли BitmapData, если да до возвращаем ссылку на нее, если нет то предварительно создаем объект из класса Embed и присваиваем ссылке в классе его BitmapData. Кроме того, что это затрудняем редактирование содержимого библиотеки, ко всему прочему не понятно как обнулить ссылку на BitmapData если нет использующих ее битмап.

Zebestov 29.05.2012 19:21

Ответ.

elder_Nosferatu 29.05.2012 19:26

Если высоздали BitmapData и забыли о нем, но хотя бы одна ссылка на него все же существует, тогда создание еще одного экземпляра BitmapData неоправдано увеличит расход памьяти. Так что лучше создать по экземпляру нужных BitmapData (если они постоянно используются, а не позказываются, скажем, в финальных титрах) и передавать ссылки на них нужным Bitmap-ам. Все BitmapData можно собрать в одном месте (склад текстур :) )

PlutDem 29.05.2012 20:48

Цитата:

Сообщение от elder_Nosferatu (Сообщение 1082004)
Если высоздали BitmapData и забыли о нем, но хотя бы одна ссылка на него все же существует, тогда создание еще одного экземпляра BitmapData неоправдано увеличит расход памьяти. Так что лучше создать по экземпляру нужных BitmapData (если они постоянно используются, а не позказываются, скажем, в финальных титрах) и передавать ссылки на них нужным Bitmap-ам.

В том то вся и проблема, что так я сделать не могу. Набор картинок очень большой и загрузить его целиком в память нельзя, а как подгружать их избирательно я не представляю.
Цитата:

Сообщение от elder_Nosferatu (Сообщение 1082004)
Все BitmapData можно собрать в одном месте (склад текстур :) )

Вот я в предыдущем своем посте нечто подобное предлагал:
Код AS3:

public class imgStorage {
 
        private static var _Orange_1:BitmapData;
 
        static function get Orange_1():BitmapData {
 
                if (!_Orange_1)
                        _Orange_1 = new Background.Orange_1()// если BitmapData нет то создаем ее из класса Embed
 
                return _Orange_1;
        }
}

Ну и можно, наверное, сделать нечто вроде счетчика текущих Bitmap использующих единую BitmapData, расширить класс Bitmap и при создании/удалении Bitmap увеличивать или уменьшать значение счетчика. Если значение счетчика будет == 0, то нужно будет удалить ссылку в imgStorage на эту BitmapData.
Но пока что способ этот выглядит очень криво и деревянно.

elder_Nosferatu 29.05.2012 21:10

А в чем идея то?
Если Вам нужно кое что из БОЛЬШОГО НАБОРА, тогда либо грузите все и потом имеете моментальный доступ к нужным ресурсам, либо грузите лиш по необходимости, но тогда будет задержка на загрузку перед отображением.
Просто не могу понять Вашу ситуацию...

З.Ы.: В одной из онлайн игр с флешовым клиентом видел хороший прием: как только локация загрузится (со всеми обьектами и неписями - они все же стандартные и 100% будут отображаться) сразу же начинается игра, а текстуры для всех игроков, которые попадают в поле зрения подтягиваются в фоновом режиме. Во время загрузки этих текстур вместо игроков подставляются только силуэты мужской/женской фигуры. Хоть это не очень красиво, но, лично меня, длительная загрузка раздражает больше :)

Добавлено через 6 минут
Цитата:

Сообщение от PlutDem (Сообщение 1082009)
Код AS3:

...
        static function get Orange_1():BitmapData {
 
                if (!_Orange_1)
                        _Orange_1 = new Background.Orange_1()// если BitmapData нет то создаем ее из класса Embed
                return _Orange_1;
        }
...


Раз у Вас ресы встроеные, значит они уже "жрут" памьять... Будете Вы их использовать или нет - они уже есть. Другой вопрос, будете лы Вы всем бимапам, что должны отображать одинаковые обьекты, передавать ссылку на одну и ту же БитмапДату, или для каждой создадите по экземпляру?

PlutDem 29.05.2012 21:32

Цитата:

Сообщение от elder_Nosferatu (Сообщение 1082012)
...либо грузите лиш по необходимости...

Вот как раз реализацию этого процесса я и прошу подсказать.
Пример:
Есть склад, на котором могут храниться любые объекты. Мы не можем хранить в памяти BitmapData'ы для всех существующих в мире объектов, поэтому подгружаем BitmapData'ы только тех объектов, которые хранятся на складе. Эти BitmapData'ы нужно где то хранить, что бы если на склад привезут, скажем, Гвозд'и, которые уже есть на складе, мы не создавали новую BitmapData'у гвоздей, а использовали уже имеющуюся. Если со склада увозят все объекты одного типа, то надобность хранить BitmapData'у отпадает и она должна быть автоматически выгружена из памяти.
Цитата:

Сообщение от elder_Nosferatu (Сообщение 1082012)
Раз у Вас ресы встроеные, значит они уже "жрут" памьять... Будете Вы их использовать или нет - они уже есть.

Опа! Т.е. вот эта конструкция автоматически добавит в память изображение Orange_1.png?
Код AS3:

[Embed(source = '../../lib/background/Orange_1.png')]
public static var Orange_1:Class;


Котяра 29.05.2012 21:41

заводить счётчик.
Вот кастомный менеджер ресурсов. (за код сильно не бейте)
https://github.com/k0t0vich/fazenda/...TileManager.as
когда мы говорим getTileByName мы увеличиваем счётчик,
когда говорим deleteResource, счётчик уменьшается.
Но тут надо аккуратно следить.

elder_Nosferatu 29.05.2012 21:45

Цитата:

Сообщение от PlutDem (Сообщение 1082015)
...
Опа! Т.е. вот эта конструкция автоматически добавит в память изображение Orange_1.png?
Код AS3:

[Embed(source = '../../lib/background/Orange_1.png')]
public static var Orange_1:Class;


Потому такие ресы и зовут встроеными :)

Добавлено через 3 минуты
Все, чем напичкано основное приложение, при старте попадает в памьять. Если есть внешние данные, тогда Вам (приложению) решать, что загружать в себя (в памьять, выделенную для себя) и что из загруженного выгрузить из себя.


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

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