|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Классы и память
Очень извиняюсь за не очень точное название, но в который раз убеждаюсь,
что знай ты правильное название, ответить на этот вопрос способен сам, в большинстве случаев. Вопрос вот какой - я не знаю, что происходит при создании экземпляра класса и какую память он занимает. Вот знаю я, что при создании, классу выделяется память для переменных и сам он тоже занимает место, но в какой памяти? Это был первый вопрос, а второй - у меня в примере класс, в его теле объявлено сотни переменных. Как понимаю я, что при создании, память будет выделена только на сам класс и сотни переменных, это так? А при клике создастся много graphics-ов и bitmap-ов и они тоже станут занимать место. Но у меня мысли, что я могу заблуждаться и память на все виды занимается при создании экземпляра... Вобщем скажите пожалуйста, как это всё происходит. 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-ы присваиваю ста переменным } } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Ну допустим, везде где Вы сказали "класс" имелся в виду экземпляр приведенного класса. //здесь обьявлены сотни переменных - (членов класса) — будет выделен кусочек памяти каждой для хранения числа или ссылки (то есть тоже числа, адреса первого бита объекта в памяти). // здесь создаю циклом сто graphics-ов — нет, не создаете. Создать экземпляр Graphics нельзя. // и тут же я создаю много bitmap-ов — имелись в виду, видимо, битмапдаты. Конечно, займут память (а как иначе? Картинка есть, а память не занимает? Магия))) Что-то подобное возможно, если битмапы будут использовать одну битмапдату, тогда память под данные пикселов будет занимать только она. Но экземпляры Bitmap, конечно, тоже (у них же есть собственные свойства (не пиксели изображения), а значит и данные). // и тут я эти graphics-ы и bitmap-ы присваиваю ста переменным — Вы присваиваете ста переменным ССЫЛКИ на Добавлено через 5 минут Цитата:
Члены класса никуда не могут деться, они статические (не в смысле static). Локальные переменные — динамические. Они могут быть созданы, а могут и нет (метод, которому они принадлежат, так и не будет вызван за всю жизнь приложения). Так зачем нужна память под них?
__________________
Reality.getBounds(this); |
|
|||||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
Цитата:
Цитата:
Добавлено через 14 минут Цитата:
Цитата:
битмапдат, то экземпляр этого класса, можно создать когда хочешь и он не окажет особого влияния на память. Так как: Цитата:
но второй голос говорил - А вдруг программа с созданием экземпляра класса, начнёт и в методах всё рассчитывать и суммировать. Спасибо Вам за помощь! |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Добавлено через 10 минут Если в теле класса объявлена то естественно при создании экземпляра будет создан экземпляр EmbedImage и он займет необходимую память. Но если у Вас в обработчике клика написан цикл то естественно, при создании экземпляра не будет создано никаких переменных и никаких экземпляров EmbedImageClass, и никакая память под это выделена не будет, это невозможно) Мало того, что неизвестно, будет ли вообще клик, так ведь и кол-во экземпляров картинки может быть переменной величиной, зависящей от места клика или введенного пользователем числа))
__________________
Reality.getBounds(this); |
|
|||||
Banned
[+1 30.08.14]
[+1 26.02.14] Регистрация: Apr 2012
Сообщений: 162
|
Вопрос топик стартеру:
А зачем вам сведения о занимаемой памяти? P.S.И вопрос некоторым завсегдатаям форума: зачем вам сравнивать скорость работы той или иной функции? |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Wolsh Вам надо книги писать! Спасибо!
Цитата:
|
|
|||||
Цитата:
Экземпляр то библиотечного класса создаётся каждый раз и занимает несколько байт, но блок памяти под картинку выделяется только перед попыткой изменить. Уже несколько лет назад адобовцы такую оптимизацию сделали. Ну а если вы пишите new BitmapData(100, 100) - то тут уж сразу кусок выделяется. Они пошли дальше: Загружаю картинку, отображаю на экране (не копируя в новую битмапу) - появляется на экране - начинает есть память, сдвигаю за пределы экрана - перестаёт (Видимо jpeg распаковывают только когда надо, да ещё и убирают когда не используется) Поначалу даже не понял в чём дело - загрузил разные блоки 2000x2000x24 - считаю - должно получиться +n мегабайт, смотрю в диспетчере задач - флешплеер всего ест в полтора раза меньше чем одни только эти распакованные картинки должны жрать. |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
Здорово! |
|
|||||
Цитата:
Я говорил про библиотечные картинки, которые в swf хранятся в png или jpeg формате Вооще да. Если взяли, создали new MyImageBitmapData(), не показали, не поменяли - выделяться не должно. Однако, не факт что "невыделение/освобождение" памяти происходит всегда, оно может происходить при хитрых условиях(нехватка памяти, например) А факт: Отсутствие перерисовки загруженных из сети или из библиотеки картинок нехило экономит память. Последний раз редактировалось expl; 25.10.2013 в 23:36. |
Часовой пояс GMT +4, время: 10:27. |
|
« Предыдущая тема | Следующая тема » |
|
|