Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.03.2011, 16:50
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 1  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
По умолчанию 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?

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

Старый 12.03.2011, 17:38
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Специально тестировал
Цитата:
var img:Bitmap = new SomeClass.IMG();
vs
Цитата:
var img:Bitmap = new Bimtap(SomeClass.IMG_BD);
Что-то разницы потребления памяти не засёк, а создавал тысячи объектов - видимо при при создании экземпляра класса-битмапы что-то оптимизируется.

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


Последний раз редактировалось expl; 12.03.2011 в 17:40.
Старый 12.03.2011, 19:04
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 3  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Цитата:
Сообщение от expl Посмотреть сообщение
Специально тестировал

vs

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

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

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

Старый 12.03.2011, 18:01
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 4  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Пометьте IMG как private и будет вам щастье...
Или я не уловил суть проблемы?

Старый 12.03.2011, 18:31
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 5  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Такой код компилируется и работает, но с предупреждением:
Код 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.
__________________
Hell is the possibility of sanity

Старый 12.03.2011, 22:14
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
При втором подходе информация о карте пикселей не дублируется? Ппохоже не дублируется - опять оптимизация. Так скоро вообще не понадобится думать о ресурсах - везде оптимизация))
Имеется в виду что создание любого объекта - это выделение памяти и последующая работа для GC по его удалению из оной. Пусть даже это один Bitmap без BitmapData

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

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

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


Последний раз редактировалось expl; 12.03.2011 в 22:21.
Старый 12.03.2011, 23:32
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 7  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Цитата:
Кстати, если нарисовать что-то на одном из img.bitmapData, остальные изменятся? (руки не доходили протестить это)
да, в этом-то и вся соль, что делая, например, шум перлина для одной битмапдаты, все остальные битмапы получают уже готовые изменения без надобности множественных вычислений этого шума
__________________
скриптограф

Старый 13.03.2011, 00:06
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
т.е. получается, что
Код 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;
Ведут себя одинаково при использовании, правильно понял?


Последний раз редактировалось expl; 13.03.2011 в 00:11.
Старый 13.03.2011, 00:19
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 9  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
нет, не правильно - ведут себя разным образом, т.к. в первом случае все битмапы получают одну и ту же карту пикселей, а во втором случае создаются битмапы с "уникальными" картами пикселей

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

Старый 13.03.2011, 00:26
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Однако, оказывается они это совсем недавно сделали, в Flash Player 10.1.

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:19.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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