Форум программистов, компьютерный форум, киберфорум
ActionScript
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 2
AS 3.0

Возрастает занимаемый объем памяти при перерисовке объекта

15.08.2014, 17:24. Показов 1029. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. При нажатии на кнопку Q1 запускается анимация контакта. При повторном нажатии контакт возвращается в исходное положение.
После публикации проверял exe файл и в диспетчере задач при каждом клике возрастает занимаемый объем памяти. Примерно после 40 кликов память с 7000 кб выросла до 11000 кб. Так и должно быть или я что-то неправильно описал в коде? В конечном варианте программы таких элементов больше 30 и через какое-то время она начинает заметно тормозить - перерисовка контактов становится дерганной.

исходный код AS 3.0
Кликните здесь для просмотра всего текста

файл Q
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package RZ{
    import flash.display.*;
    import flash.geom.*;
    import flash.text.*;
 
    public class Q extends Sprite {
        private var Q1:Shape;
        private var Qname:TextField;
        public function Q(xx:int, yy:int, nameQ:String) {
            Q1=new Shape();
            Qname=new TextField();
            Q1.graphics.lineStyle(1);
            Q1.graphics.beginFill(0x00FF00,1);
            Q1.graphics.drawRect(0,0,20,20);
            Q1.x=xx;
            Q1.y=yy;
 
            Qname=new TextField () ;
            Qname.text=nameQ;
 
            Qname.width=20;
            Qname.height=20;
            Qname.border=false;
            Qname.background=false;
            Qname.selectable=false;
            Qname.x=xx;
            Qname.y=yy-30;
            addChild(Q1);
            addChild(Qname);
        }
        public function Q_Close() {
            Q1.graphics.beginFill(0xff0000,1);
            Q1.graphics.drawRect(0,0,20,20);
        }
        public function Q_Open() {
            Q1.graphics.beginFill(0x00ff00,1);
            Q1.graphics.drawRect(0,0,20,20);
        }
    }
}
файл Contact_Time
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
package RZ{
    import flash.display.*;
    import flash.geom.*;
    import flash.text.*;
    import flash.utils.*;
 
 
    public class Contact_Time extends Sprite {
        public var contact_Time:Shape;
        public var Namecontact_Time:TextField;
        private var rele_Time:int;
        private var rele_Timer:int;
        public var yyy:int;
        public var yyyx:int;
        public var log:Boolean;
        public var timeY:int;
        public var yy1:int;
 
        public function Contact_Time(xx:int, yy:int, contact_TimeName:String) {
            yyy=10;
            contact_Time=new Shape();
            contact_Time.graphics.lineStyle(1,0x000000);
            contact_Time.graphics.moveTo(0,20);
            contact_Time.graphics.lineTo(10,20);
            contact_Time.graphics.lineStyle(1,0x00FF00);
            contact_Time.graphics.lineTo(30,0);
 
            contact_Time.graphics.moveTo(20,10);
            contact_Time.graphics.lineTo(20,-5);
            contact_Time.graphics.moveTo(12,-1);
            contact_Time.graphics.curveTo(20,-9,28,-1);
 
            contact_Time.graphics.lineStyle(1,0x000000);
            contact_Time.graphics.moveTo(30,20);
            contact_Time.graphics.lineTo(80,20);
            contact_Time.x=xx;
            contact_Time.y=yy;
            addChild(contact_Time);
 
            Namecontact_Time=new TextField () ;
            Namecontact_Time.text=contact_TimeName;
            Namecontact_Time.width=60;
            Namecontact_Time.height=20;
            Namecontact_Time.border=false;
            Namecontact_Time.background=false;
            Namecontact_Time.selectable=false;
            Namecontact_Time.x=xx;
            Namecontact_Time.y=yy+30;
            addChild(Namecontact_Time);
        }
 
        public function contact_CloseTime1() {
            trace(timeY," 1", yy1);
            yyy=0;
            rele_Time=setInterval(contact_TimeClose1,125);
        }
 
        //public function contact_CloseTimer() {
        //rele_Timer=setTimeout(contact_TimeCloser,2000);
        //trace("time ",log);
        //return (log );
 
        //}
 
        public function contact_TimeClose1( ) {
            trace(timeY," 2",yy1,yyy);
            contact_Time.graphics.lineStyle(1,0xFFFFFF);
            contact_Time.graphics.moveTo(10,20);
            contact_Time.graphics.lineTo(30,0+yyy);
            contact_Time.graphics.moveTo(20,10+yyy/2);
            contact_Time.graphics.lineTo(20,-5+yyy/2);
            contact_Time.graphics.moveTo(12,-1+yyy/2);
            contact_Time.graphics.curveTo(20,-9+yyy/2,28,-1+yyy/2);
 
            yyy=yyy+1;
            contact_Time.graphics.lineStyle(1,0xFF0000);
            contact_Time.graphics.moveTo(10,20);
            contact_Time.graphics.lineTo(30,0+yyy);
            contact_Time.graphics.moveTo(20,10+yyy/2);
            contact_Time.graphics.lineTo(20,-5+yyy/2);
            contact_Time.graphics.moveTo(12,-1+yyy/2);
            contact_Time.graphics.curveTo(20,-9+yyy/2,28,-1+yyy/2);
            trace('yyy=',yyy);
            if (yyy==20) {
                clearInterval(rele_Time);
            }
        }
        public function contact_TimeCloser( ) {
            log=true;
            clearTimeout(rele_Timer);
 
        }
 
        public function contact_TimeOpen() {
            contact_Time.graphics.lineStyle(0,0xFFFFFF);
            contact_Time.graphics.beginFill(0xffffff,1);
            contact_Time.graphics.drawRect(10,-10,20,30);
            contact_Time.graphics.endFill();
 
            //contact_Time.graphics.lineStyle(1,0xFFFFFF);
            //contact_Time.graphics.moveTo(10,20);
            //contact_Time.graphics.lineTo(30,20);
 
            //++++++++грибок+++++++++++
 
            //contact_Time.graphics.moveTo(20,10);
            //contact_Time.graphics.lineTo(20,20);
            //contact_Time.graphics.moveTo(12,9);
            //contact_Time.graphics.curveTo(20,1,28,9);
            //++++++++++++++++++++++++
 
            contact_Time.graphics.lineStyle(1,0x00FF00);
            contact_Time.graphics.moveTo(10,20);
            contact_Time.graphics.lineTo(30,0);
 
            contact_Time.graphics.moveTo(20,10);
            contact_Time.graphics.lineTo(20,-5);
            contact_Time.graphics.moveTo(12,-1);
            contact_Time.graphics.curveTo(20,-9,28,-1);
            clearInterval(rele_Time);
            return (false);
 
 
        }
        public function contact_CloseTime2() {
            trace(timeY," 1", yy1);
            yyy=0;
            rele_Time=setInterval(contact_TimeClose2,125);
        }
 
        //public function contact_CloseTimer() {
        //rele_Timer=setTimeout(contact_TimeCloser,2000);
        //trace("time ",log);
        //return (log );
 
        //}
 
        public function contact_TimeClose2( ) {
            trace(timeY," 2",yy1,yyy);
            contact_Time.graphics.lineStyle(1,0xFFFFFF);
            contact_Time.graphics.moveTo(10,20);
            contact_Time.graphics.lineTo(30,0+yyy);
            contact_Time.graphics.moveTo(20,10+yyy/2);
            contact_Time.graphics.lineTo(20,-5+yyy/2);
            contact_Time.graphics.moveTo(12,-1+yyy/2);
            contact_Time.graphics.curveTo(20,-9+yyy/2,28,-1+yyy/2);
 
            yyy=yyy+2;
            contact_Time.graphics.lineStyle(1,0xFF0000);
            contact_Time.graphics.moveTo(10,20);
            contact_Time.graphics.lineTo(30,0+yyy);
            contact_Time.graphics.moveTo(20,10+yyy/2);
            contact_Time.graphics.lineTo(20,-5+yyy/2);
            contact_Time.graphics.moveTo(12,-1+yyy/2);
            contact_Time.graphics.curveTo(20,-9+yyy/2,28,-1+yyy/2);
            if (yyy==20) {
                trace(yyy, '22');
                clearInterval(rele_Time);
            }
            trace(rele_Time);
        }
 
    }
}
файл Stend_test1
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package RZ{
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import RZ.*;
    import flash.utils.*;
    import flash.text.*;
 
    public class Stend_test1 extends Sprite {
        private var Q1:Q;
        private var Q1_C:Boolean;
        private var KT_A_3:Contact_Time;
        private var KT_A_3_C:Boolean;
        
        public function Stend_test1() {
            Q1_C=true;
            Q1=new Q(450,50,"Q1");
            addChild(Q1);
            Q1.addEventListener(MouseEvent.MOUSE_DOWN,Q1_Click);
            
            
            KT_A_3=new Contact_Time(450,150,"KT_A_3");
            addChild(KT_A_3);
            
        }
        private function Q1_Click(e:Event):void {
            if (Q1_C) {
                Q1_C=false;
                Q1.Q_Close();
                KT_A_3.contact_CloseTime1();
            } else {
                Q1_C=true;
                Q1.Q_Open();
                KT_A_3_C=KT_A_3.contact_TimeOpen();
            }
 
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.08.2014, 17:24
Ответы с готовыми решениями:

Объём памяти, занимаемый объектом TImage
Добрый день. Объясните ламеру, как узнать объём памяти, занимаемый объектом TImage с загруженной в нём картинкой? Можно, конечно,...

Для трех типов данных Объём памяти, занимаемый экземпляром СД
Задание 1. Для трех типов данных (см. вариант индивидуального задания) определить: 1.1. Объём памяти, занимаемый экземпляром СД. 1.2....

Затирание памяти при перерисовке
Люди добрые помогите! Я сразу каюсь начинающий поэтому хелп! Есть прога. В ней прописаны алгоритмы. Они точно работают нормально....

2
 Аватар для Theoryofgames
254 / 238 / 50
Регистрация: 20.12.2011
Сообщений: 707
16.08.2014, 23:59
Скорее всего это означает, что вы не удаляете слушатели событий. Сборщик мусора не трогает объект, если на него остается хотя бы одна ссылка, а слушатель событий как раз является такой ссылкой.

И еще лучше не использовать setInterval, а пользоваться таймером.
0
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 2
11.09.2014, 14:03  [ТС]
Поменял на timer. При клике на Q1 первый раз срабатывает нормально: 20 тиков, контакт замкнулся. Повторное нажатие на Q1 - контакт разомкнулся. Но при последующих нажатиях чаще всего срабатывает только 1 тик, т.е. таймер запускается, но не выполняет 20 итераций.

Про удаление слушателей событий - мне нужно, чтобы объект (квадрат Q1) был постоянно доступен для клика. В том числе, если таймер запустился и контакт начал замыкаться, повторное нажатие на Q1 должно остановить таймер и вернуть контакт в изначальное положение. Сразу после клика удалить слушатель, а потом добавить по новой? И сборщик мусора разве не начинает работать после превышения определенного порога используемой памяти?

Код AS3
Кликните здесь для просмотра всего текста
ActionScript 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
Stend_test1
package RZ{
    import flash.display.*;
    import flash.events.*;
    import flash.geom.*;
    import RZ.*;
    import flash.utils.*;
    import flash.text.*;
 
    public class Stend_test1 extends Sprite {
        private var Q1:Q;
        private var Q1_C:Boolean;
        private var KT_A_3:Contact_Time_1;
        private var KT_A_3_C:Boolean;
        
        public function Stend_test1() {
            Q1_C=true;
            Q1=new Q(450,50,"Q1");
            addChild(Q1);
            Q1.addEventListener(MouseEvent.MOUSE_DOWN,Q1_Click);
            
            
            KT_A_3=new Contact_Time_1(450,150,"KT_A_3");
            addChild(KT_A_3);
            
        }
        private function Q1_Click(e:Event):void {
            if (Q1_C) {
                Q1.removeEventListener(MouseEvent.MOUSE_DOWN,Q1_Click);
                Q1.addEventListener(MouseEvent.MOUSE_DOWN,Q1_Click);
                Q1_C=false;
                Q1.Q_Close();
                KT_A_3.contact_CloseTime1();
            } else {
                Q1.removeEventListener(MouseEvent.MOUSE_DOWN,Q1_Click);
                Q1.addEventListener(MouseEvent.MOUSE_DOWN,Q1_Click);
                Q1_C=true;
                Q1.Q_Open();
                KT_A_3_C=KT_A_3.contact_TimeOpen();
            }
 
        }
    }
}
 
Contact_Time_1
package RZ{
    import flash.display.*;
    import flash.geom.*;
    import flash.text.*;
    import flash.utils.*;
import flash.events.*
 
    public class Contact_Time_1 extends Sprite {
        public var contact_Time:Shape;
        public var Namecontact_Time:TextField;
        private var rele_Time:int;
        private var rele_Timer:int;
        public var yyy:int;
        public var yyyx:int;
        public var log:Boolean;
        public var timeY:int;
        public var yy1:int;
public var myTimer:Timer = new Timer( 500, 20 );
        public function Contact_Time_1(xx:int, yy:int, contact_TimeName:String) {
            yyy=10;
            contact_Time=new Shape();
            contact_Time.graphics.lineStyle(1,0x000000);
            contact_Time.graphics.moveTo(0,20);
            contact_Time.graphics.lineTo(10,20);
            contact_Time.graphics.lineStyle(1,0x00FF00);
            contact_Time.graphics.lineTo(30,0);
 
            contact_Time.graphics.moveTo(20,10);
            contact_Time.graphics.lineTo(20,-5);
            contact_Time.graphics.moveTo(12,-1);
            contact_Time.graphics.curveTo(20,-9,28,-1);
 
            contact_Time.graphics.lineStyle(1,0x000000);
            contact_Time.graphics.moveTo(30,20);
            contact_Time.graphics.lineTo(80,20);
            contact_Time.x=xx;
            contact_Time.y=yy;
            addChild(contact_Time);
 
            Namecontact_Time=new TextField () ;
            Namecontact_Time.text=contact_TimeName;
            Namecontact_Time.width=60;
            Namecontact_Time.height=20;
            Namecontact_Time.border=false;
            Namecontact_Time.background=false;
            Namecontact_Time.selectable=false;
            Namecontact_Time.x=xx;
            Namecontact_Time.y=yy+30;
            addChild(Namecontact_Time);
        }
 
        public function contact_CloseTime1() {
            //var newValue:int=contact_TimeClose1;
            
//Запускаем таймер.
myTimer.start();
trace("start");
            //trace(timeY," 1", yy1);
            yyy=0;
            myTimer.addEventListener( TimerEvent.TIMER, contact_TimeClose1 );
            //rele_Time=setInterval(contact_TimeClose1,125);
        //if (newValue==20){
        //myTimer.stop();
            //}
            }
 
 
 
         function contact_TimeClose1(e:TimerEvent  ):int {
            trace(timeY," 2",yy1,yyy);
            contact_Time.graphics.lineStyle(1,0xFFFFFF);
            contact_Time.graphics.moveTo(10,20);
            contact_Time.graphics.lineTo(30,0+yyy);
            contact_Time.graphics.moveTo(20,10+yyy/2);
            contact_Time.graphics.lineTo(20,-5+yyy/2);
            contact_Time.graphics.moveTo(12,-1+yyy/2);
            contact_Time.graphics.curveTo(20,-9+yyy/2,28,-1+yyy/2);
 
            yyy=yyy+1;
            contact_Time.graphics.lineStyle(1,0xFF0000);
            contact_Time.graphics.moveTo(10,20);
            contact_Time.graphics.lineTo(30,0+yyy);
            contact_Time.graphics.moveTo(20,10+yyy/2);
            contact_Time.graphics.lineTo(20,-5+yyy/2);
            contact_Time.graphics.moveTo(12,-1+yyy/2);
            contact_Time.graphics.curveTo(20,-9+yyy/2,28,-1+yyy/2);
            trace('yyy=',yyy);
            //if (yyy==20) {
                //myTimer.stop();
            //}
            return (yyy);
        }
 
 
        public function contact_TimeOpen() {
            myTimer.stop();
            trace("stop");
            //myTimer.removeEventListener( TimerEvent.TIMER, contact_TimeClose1 );
            contact_Time.graphics.lineStyle(0,0xFFFFFF);
            contact_Time.graphics.beginFill(0xffffff,1);
            contact_Time.graphics.drawRect(10,-10,20,30);
            contact_Time.graphics.endFill();
 
 
 
            contact_Time.graphics.lineStyle(1,0x00FF00);
            contact_Time.graphics.moveTo(10,20);
            contact_Time.graphics.lineTo(30,0);
 
            contact_Time.graphics.moveTo(20,10);
            contact_Time.graphics.lineTo(20,-5);
            contact_Time.graphics.moveTo(12,-1);
            contact_Time.graphics.curveTo(20,-9,28,-1);
            clearInterval(rele_Time);
            return (false);
 
 
        }
    
 
    }
}
 
Q
package RZ{
    import flash.display.*;
    import flash.geom.*;
    import flash.text.*;
 
    public class Q extends Sprite {
        private var Q1:Shape;
        private var Qname:TextField;
        public function Q(xx:int, yy:int, nameQ:String) {
            Q1=new Shape();
            Qname=new TextField();
            Q1.graphics.lineStyle(1);
            Q1.graphics.beginFill(0x00FF00,1);
            Q1.graphics.drawRect(0,0,20,20);
            Q1.x=xx;
            Q1.y=yy;
 
            Qname=new TextField () ;
            Qname.text=nameQ;
 
            Qname.width=20;
            Qname.height=20;
            Qname.border=false;
            Qname.background=false;
            Qname.selectable=false;
            Qname.x=xx;
            Qname.y=yy-30;
            addChild(Q1);
            addChild(Qname);
        }
        public function Q_Close() {
            Q1.graphics.beginFill(0xff0000,1);
            Q1.graphics.drawRect(0,0,20,20);
        }
        public function Q_Open() {
            Q1.graphics.beginFill(0x00ff00,1);
            Q1.graphics.drawRect(0,0,20,20);
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2014, 14:03
Помогаю со студенческими работами здесь

Объём, занимаемый String
Подскажите, пожалуйста, каким образом выделяется память в Delphi под переменную типа String? Ведь максимальный объём переменной может...

Acronis true image clone hdd увеличился занимаемый объем
Добрый день! Сделал полное клонирование жесткого диска с 500Гб на 160Гб диск. В результате после клонирования занимаемый объем на...

Как определить размер занимаемый в памяти рользовательской переменной?
Мне нужно определить размер занимаемый в памяти пользовательской переменной типа: Public Type BLOCK block_type As blockType ...

Постоянно возрастает количество занимаемой памяти
Вечер добрый. Вот код программы using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Как узнать объем виртуальной памяти и объем файла подкачки?
Как с помощью командного файла можно узнать объем виртуальной памяти, а также объем файла подкачки??


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru