Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   BitmapData, как очистить память (http://www.flasher.ru/forum/showthread.php?t=152634)

ЗлОй ПрОграММер 20.03.2011 21:08

BitmapData, как очистить память
 
Сделал функцию для проверки столкновений мувиклипов

Код AS3:

public static function CheckCollision(Object1: MovieClip,
                                      Object2: MovieClip): Boolean
{
//--------------------------------------------------------------------
        var bmpd1: BitmapData;
        var bmpd2: BitmapData;
        var bool: Boolean;
//--------------------------------------------------------------------       
        bmpd1 = new BitmapData(550, 400, true, 0);
        bmpd2 = new BitmapData(550, 400, true, 0);
        bmpd1.fillRect(bmpd1.rect, 0);
        bmpd2.fillRect(bmpd2.rect, 0);
        bmpd1.draw(Object1, new Matrix(1, 0, 0, 1, Object1.x, Object1.y));
        bmpd2.draw(Object2, new Matrix(1, 0, 0, 1, Object2.x, Object2.y));
        if (bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255))
        {
                bool = true;
        }
        else
        {
                bool = false;
        }
        bmpd1.dispose();
        bmpd2.dispose();
        bmpd1 = null;
        bmpd2 = null;
//--------------------------------------------------------------------       
        return bool;
//--------------------------------------------------------------------       
}

Проблема теперь в том чтобы очистить память отведённую под bmpd1 и bmpd2.
особенно если проверку столкновений делать в EnterFrame память всё растёт и растёт, как это поправить у кого есть идеи ?

iNils 20.03.2011 21:22

dispose и отчищает память. Если, есть утечка, то ищите в другом месте. Воспользуйтесь профайлером.

ЗлОй ПрОграММер 20.03.2011 21:27

dispose помогает я нечего не говорю, но сёравно если часто вызывать эту функцию то память растёт

goodguy 20.03.2011 22:11

Цитата:

dispose помогает я нечего не говорю, но сёравно если часто вызывать эту функцию то память растёт
Она растет пока сборщик мусора ее не очистит.

з.ы. А разве hitTest() есть в AS3? O_o

ЗлОй ПрОграММер 20.03.2011 22:12

для BitmapData есть) а можно принудительно вызвать сборщик мусора ? и следует ли это делать ?

Psycho Tiger 20.03.2011 22:24

Следует, in debug purposes.

goodguy 20.03.2011 22:32

Цитата:

для BitmapData есть)
А, блин, точно. Давно уже не пользовался, забыл :D

Цитата:

а можно принудительно вызвать сборщик мусора ?
http://silin.su/#AS3/utils/gc

ЗлОй ПрОграММер 20.03.2011 23:16

скачал исходник, запустил его проверять, память как нагружалась так и продолжает нагружаться

Psycho Tiger 20.03.2011 23:18

Я Вам гарантирую, что Вы не удаляете все ссылки на объект.

ЗлОй ПрОграММер 20.03.2011 23:37

посмотрите я скину весь код
вот класс MathGeom в котором есть функция для проверки столкновений
Код AS3:

package  {
 
        import flash.display.MovieClip;
        import flash.display.BitmapData;
        import flash.geom.Matrix;
        import flash.geom.Point;
 
        public class MathGeom {
 
 
                public static function CheckCollision(Object1: MovieClip,
                                                    Object2: MovieClip): Boolean
                {
                //--------------------------------------------------------------------
                        var bmpd1: BitmapData;
                        var bmpd2: BitmapData;
                        var bool: Boolean;
                //--------------------------------------------------------------------       
                        bmpd1 = new BitmapData(1550, 1400, true, 0);
                        bmpd2 = new BitmapData(500, 400, true, 0);
                        bmpd1.fillRect(bmpd1.rect, 0);
                        bmpd2.fillRect(bmpd2.rect, 0);
                        bmpd1.draw(Object1, new Matrix(1, 0, 0, 1, Object1.x, Object1.y));
                        bmpd2.draw(Object2, new Matrix(1, 0, 0, 1, Object2.x, Object2.y));
                        if (bmpd1.hitTest(new Point(), 255, bmpd2, new Point(), 255))
                        {
                                bool = true;
                        }
                        else
                        {
                                bool = false;
                        }
                        bmpd1.dispose();
                        bmpd2.dispose();
                        bmpd1 = null;
                        bmpd2 = null;
                //--------------------------------------------------------------------       
                        return bool;
                //--------------------------------------------------------------------       
                }
 
        }
}

а вот главный класс
Код AS3:

package  {
 
        import flash.display.MovieClip;
        import flash.geom.Point;
        import flash.geom.Matrix;
        import flash.display.BitmapData;
        import flash.events.Event;
        import MathGeom;
 
 
        public class Main extends MovieClip {
 
                public var a: aaa = new aaa; //MovieClip
                public var b: bbb = new bbb; //MovieClip
 
                public function Main() {
                        a.x = 100;
                        a.y = 100;
                        addChild(a);
                        b.x = 170;
                        b.y = 100;
                        addChild(b);                       
 
                        this.addEventListener(Event.ENTER_FRAME, EnterFrame);
                }
 
                private function EnterFrame(e: Event): void {
                        trace(MathGeom.CheckCollision(a, b));               
                }
 
        }
 
}



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

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