Форум программистов, компьютерный форум, киберфорум
Наши страницы
ActionScript
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/2: Рейтинг темы: голосов - 2, средняя оценка - 5.00
welsh
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 2
1

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

15.08.2014, 17:24. Просмотров 439. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2014, 17:24
Ответы с готовыми решениями:

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

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

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

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

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

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

И еще лучше не использовать setInterval, а пользоваться таймером.
0
welsh
0 / 0 / 0
Регистрация: 15.08.2014
Сообщений: 2
11.09.2014, 14:03  [ТС] 3
Поменял на 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2014, 14:03

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

Объем выделяемой памяти при определении данных директивами db, dw, dd, dup
Text DB 20h,20h,'ludy!'; Pole DW 20 DUP (0); M2 DD 2 DUP (?) ; Хочу понять в какой...

Адрес объекта в памяти при наследовании
Здравствуйте. Имею вот такой код: class ClassA { public ClassA(void *ptr1) { ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru