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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.10.2013, 01:26
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 1  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
По умолчанию Классы и память

Очень извиняюсь за не очень точное название, но в который раз убеждаюсь,
что знай ты правильное название, ответить на этот вопрос способен сам, в большинстве случаев.
Вопрос вот какой - я не знаю, что происходит при создании экземпляра класса и какую память он занимает.
Вот знаю я, что при создании, классу выделяется память для переменных и сам он тоже занимает место, но в какой памяти? Это был первый вопрос, а второй - у меня в примере класс, в его теле объявлено сотни переменных. Как понимаю я, что при создании, память будет выделена только на сам класс и сотни переменных, это так? А при клике создастся много graphics-ов и bitmap-ов и они тоже станут занимать место.
Но у меня мысли, что я могу заблуждаться и память на все виды занимается при создании экземпляра...
Вобщем скажите пожалуйста, как это всё происходит.
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
 
	public class Main extends Sprite
	{
		//здесь обьявлены сотни переменных
		public function Main() 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
 
			super.addEventListener(MouseEvent.MOUSE_DOWN, super_mouseDownHandler);
		}
 
		private function super_mouseDownHandler(event:MouseEvent):void 
		{
			// здесь создаю циклом сто graphics-ов 
			// и тут же я создаю много bitmap-ов
			// и тут я эти graphics-ы и bitmap-ы присваиваю ста переменным 
		}
	}
}

Старый 25.10.2013, 02:03
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Вот знаю я, что при создании, классу выделяется память для переменных и сам он тоже занимает место, но в какой памяти?
А какие бывают? И что Вы называете "созданием класса"? Создание экземпляра? Как бы суть вопроса нимало зависит от того, что Вы имеете в виду.
Ну допустим, везде где Вы сказали "класс" имелся в виду экземпляр приведенного класса.
//здесь обьявлены сотни переменных - (членов класса) — будет выделен кусочек памяти каждой для хранения числа или ссылки (то есть тоже числа, адреса первого бита объекта в памяти).
// здесь создаю циклом сто graphics-ов — нет, не создаете. Создать экземпляр Graphics нельзя.
// и тут же я создаю много bitmap-ов — имелись в виду, видимо, битмапдаты. Конечно, займут память (а как иначе? Картинка есть, а память не занимает? Магия))) Что-то подобное возможно, если битмапы будут использовать одну битмапдату, тогда память под данные пикселов будет занимать только она. Но экземпляры Bitmap, конечно, тоже (у них же есть собственные свойства (не пиксели изображения), а значит и данные).
// и тут я эти graphics-ы и bitmap-ы присваиваю ста переменным — Вы присваиваете ста переменным ССЫЛКИ на графиксы и битмапы. Битмапы уже есть в памяти, переменная хранит только адрес блока памяти, то есть число.

Добавлено через 5 минут
Цитата:
Но у меня мысли, что я могу заблуждаться и память на все виды занимается при создании экземпляра...
Ну это же невозможно. Откуда при создании экземпляра знать, сколько памяти нужно битмапдатам или массивам/локальным переменным, создаваемым, например, в цикле? Будет день и будет пища.
Члены класса никуда не могут деться, они статические (не в смысле static). Локальные переменные — динамические. Они могут быть созданы, а могут и нет (метод, которому они принадлежат, так и не будет вызван за всю жизнь приложения). Так зачем нужна память под них?
__________________
Reality.getBounds(this);

Старый 25.10.2013, 02:22
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 3  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
А какие бывают?
Оперативная, но я так сказал, по тому, что есть ещё память, которая флеш плеером выделяется и она ещё кажется ограничена.
Цитата:
Конечно, займут память (а как иначе? Картинка есть, а память не занимает? Магия)))
Семь месяцев ещё не сбили налёт наивности
Цитата:
сотни переменных - (членов класса)
Спасибо! И Спасибо!

Добавлено через 14 минут
Цитата:
Ну это же невозможно. Откуда при создании экземпляра знать, сколько памяти нужно битмапдатам или массивам/локальным переменным, создаваемым, например, в цикле?
Запутался, понял только одно - при создании экземпляра класса, выделяется память на все его переменные ( члены ) обьявленые на уровне класса.
Цитата:
Откуда при создании экземпляра знать, сколько памяти нужно битмапдатам
А память на сами битмапдаты не выделяется и это означает, что если у меня в классе есть много
битмапдат, то экземпляр этого класса, можно создать когда хочешь и он не окажет особого влияния на память. Так как:
Цитата:
Откуда при создании экземпляра знать, сколько памяти нужно битмапдатам
Радует, а то я просто в примере увидел, что с самого запуска приложения, сразу создаются классы и помещаются в массив. Вот это меня и вынудило спросить, так как десять переменных это одно,
но второй голос говорил - А вдруг программа с созданием экземпляра класса, начнёт и в методах всё рассчитывать и суммировать. Спасибо Вам за помощь!

Старый 25.10.2013, 02:55
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
А память на сами битмапдаты не выделяется и это означает, что если у меня в классе есть много
битмапдат, то экземпляр этого класса, можно создать когда хочешь и он не окажет особого влияния на память.
Если имеются в виду ассеты, то есть ресурсы, то есть картинки, лежащие в библиотеке, то они сами являются классами. Соответственно ИХ экземпляры, этих Классов, будут создаваться когда нужно в экземплярах-хозяевах. Эти экземпляры будут индивидуальными, как любой экземпляр, и требовать свою память. Элементарно — Вы может нарисуете в рантайме что-то на "библиотечной" картинке, это же не должно изменить картинку-Класс в библиотеке, только личную картинку экземпляра.

Добавлено через 10 минут
Если в теле класса объявлена
Код AS3:
var picture1:Bitmap = new EmbedImageClass() as Bitmap;
то естественно при создании экземпляра будет создан экземпляр EmbedImage и он займет необходимую память.
Но если у Вас в обработчике клика написан цикл
Код AS3:
for(var i:uint = 0; i < 100; i++)
{
	var picture1:Bitmap = new EmbedImageClass() as Bitmap;
}
то естественно, при создании экземпляра не будет создано никаких переменных и никаких экземпляров EmbedImageClass, и никакая память под это выделена не будет, это невозможно) Мало того, что неизвестно, будет ли вообще клик, так ведь и кол-во экземпляров картинки может быть переменной величиной, зависящей от места клика или введенного пользователем числа))
__________________
Reality.getBounds(this);

Старый 25.10.2013, 04:35
Koopa вне форума Посмотреть профиль Найти все сообщения от Koopa
  № 5  
Ответить с цитированием
Koopa
Banned
[+1 30.08.14]
[+1 26.02.14]

Регистрация: Apr 2012
Сообщений: 162
Вопрос топик стартеру:
А зачем вам сведения о занимаемой памяти?

P.S.И вопрос некоторым завсегдатаям форума: зачем вам сравнивать скорость работы той или иной функции?

Старый 25.10.2013, 08:50
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 6  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
зачем вам сравнивать скорость работы той или иной функции?
Кэп мне тут подсказывает, чтобы знать как добиться лучшей производительности

Старый 25.10.2013, 14:20
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 7  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Wolsh Вам надо книги писать! Спасибо!
Цитата:
А зачем вам сведения о занимаемой памяти?
Мне хочется понимать весь процесс, тем более такой важный как память.

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Эти экземпляры будут индивидуальными, как любой экземпляр, и требовать свою память. Элементарно — Вы может нарисуете в рантайме что-то на "библиотечной" картинке, это же не должно изменить картинку-Класс в библиотеке, только личную картинку экземпляра.
А как же не рассказать про чудо оптимизации флешплеера?
Экземпляр то библиотечного класса создаётся каждый раз и занимает несколько байт, но блок памяти под картинку выделяется только перед попыткой изменить. Уже несколько лет назад адобовцы такую оптимизацию сделали.
Ну а если вы пишите new BitmapData(100, 100) - то тут уж сразу кусок выделяется.

Они пошли дальше: Загружаю картинку, отображаю на экране (не копируя в новую битмапу) - появляется на экране - начинает есть память, сдвигаю за пределы экрана - перестаёт
(Видимо jpeg распаковывают только когда надо, да ещё и убирают когда не используется)
Поначалу даже не понял в чём дело - загрузил разные блоки 2000x2000x24 - считаю - должно получиться +n мегабайт, смотрю в диспетчере задач - флешплеер всего ест в полтора раза меньше чем одни только эти распакованные картинки должны жрать.

Старый 25.10.2013, 23:18
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 9  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
появляется на экране - начинает есть память, сдвигаю за пределы экрана - перестаёт
Это получается, что если я даже сразу создам битмапу, но спрячу её за экран, память не выделиться?
Здорово!

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Это получается, что если я даже сразу создам битмапу, но спрячу её за экран, память не выделиться?
Здорово!
Если создадите с нуля, ещё как выделится И никуда не денется пока ссылок на неё не останется или dispose() не вызовите
Я говорил про библиотечные картинки, которые в swf хранятся в png или jpeg формате

Вооще да. Если взяли, создали new MyImageBitmapData(), не показали, не поменяли - выделяться не должно.
Однако, не факт что "невыделение/освобождение" памяти происходит всегда, оно может происходить при хитрых условиях(нехватка памяти, например)
А факт: Отсутствие перерисовки загруженных из сети или из библиотеки картинок нехило экономит память.


Последний раз редактировалось expl; 25.10.2013 в 23:36.
Создать новую тему Ответ Часовой пояс GMT +4, время: 10:27.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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