Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Embed и оптимизация затрат памяти (http://www.flasher.ru/forum/showthread.php?t=152159)

orcpochta 12.03.2011 16:50

Embed и оптимизация затрат памяти
 
Монтируем растр в класс SomeClass на уровне статической константы:

Код AS3:

public class SomeClass
{
    [Embed(source = 'img.png')]
    public static const IMG:Class;
}

Далее, если мы хотим воспользоваться этим растром:

Код AS3:

var img:Bitmap = new SomeClass.IMG();

Вроде все хорошо, но что, если необходимо множественное использование этого растра, причем в различных экземплярах не проводится преобразование над картой пикселей, или если надо делать преобразование одинаковое для всех экземпляров растра?

Тогда нам придется изменить класс с растром так:

Код AS3:

public class SomeClass
{
    [Embed(source = 'img.png')]
    public static const IMG:Class;
 
    public static const IMG_BD:BitmapData = Bitmap(new SomeClass.IMG()).bitmapData;
}

Тогда мы можем использовать множество экранных объектов, со ссылкой на одну единственную карту пикселей:

Код AS3:

var img0:Bitmap = new Bitmap(SomeClass.IMG_BD);
...
var img100:Bitmap = new Bitmap(SomeClass.IMG_BD);

Вроде как это должно экономить память по сравнению с:

Код AS3:

var img0:Bitmap = new SomeClass.IMG();
...
var img100:Bitmap = new SomeClass.IMG();

Но при этом класс, куда мы монтировали растр, содержит в себе избыточную информацию: константы IMG и IMG_BD, которые по сути описывают одни и те же данные, но с разных аспектов.

Вопрос: как избавиться от избыточности? (Как вмонтировать карту пикселей?)
Или даже так: как вмонтировать карту пикселей без использования Flash IDE, а используя FD?

Или я в корне все неверно понимаю?

expl 12.03.2011 17:38

Специально тестировал
Цитата:

var img:Bitmap = new SomeClass.IMG();
vs
Цитата:

var img:Bitmap = new Bimtap(SomeClass.IMG_BD);
Что-то разницы потребления памяти не засёк, а создавал тысячи объектов - видимо при при создании экземпляра класса-битмапы что-то оптимизируется.

Другой вопрос - часто нужна только BitmapData и как-бы незачем создавать ради ее получения еще и Bitmap - так что от второго подхода хуже не будет это точно.

i.o. 12.03.2011 18:01

Пометьте IMG как private и будет вам щастье...
Или я не уловил суть проблемы?

wvxvw 12.03.2011 18:31

Такой код компилируется и работает, но с предупреждением:
Код AS3:

package  
{
        import flash.display.BitmapData;
 
        [Embed(source='../lib/image.jpeg')]
 
        /**
        * ...
        * @author wvxvw
        */

        public class EmbeddedBitmapData extends BitmapData
        {
                public function EmbeddedBitmapData() { super(0, 0); }
        }
}

Код AS3:

package  
{
        import flash.display.Bitmap;
        import flash.display.Sprite;
 
        /**
        * ...
        * @author wvxvw
        */

        public class TestEmbedBitmap extends Sprite
        {
                public function TestEmbedBitmap()
                {
                        super();
                        this.test();
                }
 
                public function test():void
                {
                        super.addChild(new Bitmap(new EmbeddedBitmapData()));
                }
        }
}

Код:

Warning: Class 'EmbeddedBitmapData' does not extend the 'DefineBits' asset base class 'flash.display.Bitmap'.
При чем, в предупреждении явная ложь, BitmapData наследует DefineBits.

orcpochta 12.03.2011 19:04

Цитата:

Сообщение от expl (Сообщение 979961)
Специально тестировал

vs

Что-то разницы потребления памяти не засёк, а создавал тысячи объектов - видимо при при создании экземпляра класса-битмапы что-то оптимизируется.

Я тоже тестировал и сумел получить разницу в несколько метров при больших растрах и в больших количествах - похоже, что это разница создается "шелухой" при создании битмапа из вмонтированного как класс растра, что в нормальных условиях, естественно, несущественно - видимо действительно оптимизация.

Цитата:

Другой вопрос - часто нужна только BitmapData и как-бы незачем создавать ради ее получения еще и Bitmap - так что от второго подхода хуже не будет это точно.
При втором подходе информация о карте пикселей не дублируется? Ппохоже не дублируется - опять оптимизация. Так скоро вообще не понадобится думать о ресурсах - везде оптимизация))

Добавлено через 2 минуты
Но если там реально оптимизация, то эта статья ей противоречит:
http://help.adobe.com/ru_RU/as3/mobi...7189-7ffe.html

expl 12.03.2011 22:14

Цитата:

При втором подходе информация о карте пикселей не дублируется? Ппохоже не дублируется - опять оптимизация. Так скоро вообще не понадобится думать о ресурсах - везде оптимизация))
Имеется в виду что создание любого объекта - это выделение памяти и последующая работа для GC по его удалению из оной. Пусть даже это один Bitmap без BitmapData

Цитата:

Но если там реально оптимизация, то эта статья ей противоречит:
http://help.adobe.com/ru_RU/as3/mobi...7189-7ffe.html
Нисколечки не противоречит и в некоторых случаях ускоряет работу в 10-ки раз.
И если создавать каджый раз ту же битмапдату через new BitmapData() , а старую сносить - это будет в 4 раза медленне, чем реиспользовать старую, предварительно почистив fillRect-ом.

Тесты про различия на пару метров при создании кучи Bitmap'ов говорят только о том, чо эти битмапы каким-то хитрым образом используют одну и ту же вэмбеженную BitmapData. Только и всего.

Кстати, если нарисовать что-то на одном из img.bitmapData, остальные изменятся? (руки не доходили протестить это)

orcpochta 12.03.2011 23:32

Цитата:

Кстати, если нарисовать что-то на одном из img.bitmapData, остальные изменятся? (руки не доходили протестить это)
да, в этом-то и вся соль, что делая, например, шум перлина для одной битмапдаты, все остальные битмапы получают уже готовые изменения без надобности множественных вычислений этого шума

expl 13.03.2011 00:06

т.е. получается, что
Код AS3:

[Embed(...
...static var embbededBitmap;
...static var embededBitmapInstance = new embededBitmap() as Bitmap;
...
var bitmap1:Bitmap = new Bitmap(Ebedings.embededBitmapInstance.bitmapData);
var bitmap2:Bitmap = new Bitmap(Ebedings.embededBitmapInstance.bitmapData);

и
Код AS3:

[Embed(...
...static var embbededBitmap;
...
var bitmap1:Bitmap = new Ebedings.embededBitmapClass() as Bitmap;
var bitmap2:Bitmap = new Ebedings.embededBitmapClass() as Bitmap;

Ведут себя одинаково при использовании, правильно понял?

orcpochta 13.03.2011 00:19

нет, не правильно - ведут себя разным образом, т.к. в первом случае все битмапы получают одну и ту же карту пикселей, а во втором случае создаются битмапы с "уникальными" картами пикселей

в кавычках потому, что нашелся ответ на загадочную оптимизацию из верхних постов:
http://help.adobe.com/ru_RU/as3/mobi...7189-7ff9.html

expl 13.03.2011 00:26

Однако, оказывается они это совсем недавно сделали, в Flash Player 10.1.


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

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