Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   После срабатывания gc, ENTER_FRAME некорректно работает (http://www.flasher.ru/forum/showthread.php?t=146157)

medvedya2 30.10.2010 07:23

После срабатывания gc, ENTER_FRAME некорректно работает
 
У меня в приложение память потихоньку растет наступает определённый момент и gc срабатывает и очищает всю память, если перед моментом срабатывание gc происходят сложные много занимающие в памяти процессы то после gc ENTER_FRAME ведет себя некорректно работает в 2 раз реже, FPS(50) не падает, Wmode=gpu , проверял на 3 компьютерах, уже 3 день бьюсь над это проблемой.
Если не указать Wmode=gpu или Wmode=derect то ENTER_FRAME всегда работает мелено
Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.geom.Matrix;
        import flash.geom.Rectangle;
        import flash.utils.Timer;
 
 
 
 
 
 
        public class GameScreen extends Sprite
        {
                public static var monsters:Sprite = new Sprite;
                public static var buildings:Sprite = new Sprite;
                public static var corpsesData:BitmapData = new BitmapData(Config.mapSizeX,Config.mapSizeY ,true,0);;
                public static var corpses:Bitmap= new Bitmap(corpsesData);
                public static var mBitmapData:BitmapData= new BitmapData(Config.mapSizeX,Config.mapSizeY);
                public static var mBitmap:Bitmap= new Bitmap(mBitmapData);
                public static var background:Sprite = new Sprite();
                public static var backgroundUp:Sprite = new Sprite();
                public static var mines:Sprite= new Sprite();
                public static var turrets:Sprite = new Sprite();
                public static var ofhs:Sprite = new Sprite();
                public static var pointForBot:Img_pointForBot = new Img_pointForBot;
                public static var corpsesBot:Sprite= new Sprite;
                private var tick:int;
                private var xForB:uint;
                private var yForB:uint;
                private var cForB:uint;
                public static var recForClean:Rectangle = new Rectangle(0,0,Config.mapSizeX,Config.mapSizeY);
                public static var nextLevel:Sprite= new Sprite;
                private var testmc:Sprite= new Sprite;
                private var matrix:Matrix = new Matrix;
                public function GameScreen()
                {
 
                }
                public function start():void
                {
                        this.addEventListener(Event.ENTER_FRAME,onFrame);
                        this.addChild(background);
                        this.addChild(backgroundUp);
                        this.addChild(corpses);
                        this.addChild(corpsesBot);
                        this.addChild(mines);
                        this.addChild(turrets);
                        this.addChild(Repository.hero);
                        this.addChild(ofhs);
                        this.addChild(mBitmap);
                        this.addChild(buildings);
                        buildings.mouseChildren=false;
                        buildings.mouseEnabled=false;
                        buildings.cacheAsBitmap=true;
                        this.addEventListener(MouseEvent.MOUSE_DOWN,KeyboardControl.onMouseDown);
                        this.addEventListener(MouseEvent.MOUSE_UP,KeyboardControl.onMouseUP);
                        this.addChild(testmc);
                        this.addChild(pointForBot);
                        this.addChild(nextLevel);
                        pointForBot.visible=false;
                        //mBitmapData.fillRect(recForClean,0);
 
                }
                private function onFrame(e:Event):void
                {
 
 
                        var i1:int;
                        var i2:int;
 
                        for each(var obj:Monster in Monster.monsters)
                        {
                                obj.onFrame();
                        }
                        for each(var obj2:Mine in Mine.mines)
                        {
                                obj2.onFrame();
                        }
                        for each(var obj3:Bullet in Bullet.bullets)
                        {
                                obj3.onFrame();
                        }
                        for each(var obj4:Turret in Turret.turrets)
                        {
                                obj4.onFrame();
                        }
 
                        for each(var obj6:HeroBuillding in HeroBuillding.heroBuilldings)
                        {
                                obj6.onFrame();
                        }
                        for each(var obj7:Bot in Bot.bots)
                        {
                                obj7.onFrame();
                        }
 
                        for each(var obj8:NextLevel in NextLevel.nextLevels)
                        {
                                obj8.onFrame();
                        }
                        for each(var obj5:Ofh in Ofh.ofhs)
                        {
                        obj5.onFrame();
                        }
                        obj=null;
                        obj2=null;
                        obj3=null;
                        obj4=null;
                        obj5=null;
                        obj6=null;
                        obj7=null;
                        obj8=null;
                        FactorSpeed.onFrame();
                        if(1==2)//дебаг сетки
                        {
                                testmc.alpha=0.5;
                                testmc.graphics.clear();
                                testmc.graphics.beginFill(0);
                                testmc.mouseEnabled=false;
                                testmc.mouseChildren=false;
                                for(i1=0;i1<30;i1++)
                                        for(i2=0;i2<30;i2++)
                                        {
                                                if(Repository.gridMonsters[i1][i2].length>0)
                                                {
                                                        //trace(i1+" "+i2);
                                                        testmc.graphics.drawRect(i1*Config.gridSize,i2*Config.gridSize,Config.gridSize,Config.gridSize);
                                                }
                                        }               
 
                        }
                        if(Hero.X<=Config.mapSizeX-800/2&&Hero.X>=800/2)
                        {
                                x-=int(Hero.X+x-800/2);
 
                        }
                        if(Hero.Y<=Config.mapSizeY-600/2&&Hero.Y>=600/2)
                        {
                                y-=int(Hero.Y+y-600/2);
 
                        }       
                        tick++;
 
                        if(tick%3==0){
                                mBitmapData.lock();
                                recForClean.x=int(x*-1)-Hero.SPEED*3;
                                recForClean.y=int(y*-1)-Hero.SPEED*3;
                                recForClean.height=stage.stageHeight+Hero.SPEED*2*3;
                                recForClean.width=stage.stageWidth+Hero.SPEED*2*3;
 
                                mBitmapData.fillRect(recForClean,0);
                                var o2:Bot;
                                for each (o2 in Bot.bots)
                                {
                                        if(o2.draw&&(Math.abs(int(-1*x+800/2)-o2.x-o2.size)<900/2)&&(Math.abs(int(-1*y+600/2)-o2.y-o2.size)<700/2))
                                        {
                                                matrix.identity();
                                                matrix.rotate(o2.rotation);
                                                matrix.translate(o2.x, o2.y);
                                                mBitmapData.draw(o2.graphicBot,matrix);
 
                                        }               
                                }
 
                                o2=null;
                                for each (var o:Monster in Monster.monsters)
                                {
                                        if((Math.abs(int(-1*x+800/2)-o.x-o.size)<900/2)&&(Math.abs(int(-1*y+600/2)-o.y-o.size)<700/2))
                                        {
                                                matrix.identity();
                                                matrix.rotate(o.rotation);
                                                matrix.translate(o.x, o.y);
                                                mBitmapData.draw(o.graphicMonster,matrix);
 
                                        }               
                                }
 
                                o=null;
                                mBitmapData.unlock();
                        }
 
                        //e.updateAfterEvent();
                }
                public static function pointMapSize(x1:int,y1:int):Boolean
                {
                        return x1<=Config.mapSizeX&&y1<=Config.mapSizeY&&x1>0&&y1>0;       
                }
        }
}


Psycho Tiger 30.10.2010 10:08

Флешку в студию с минимализированным примером, а не тучей мусора, который к теме не относится.

medvedya2 31.10.2010 00:04

Флешка http://medveduka.ru/flasher/engineertestforflasher.html запускать через дебуг плеер.
на клавишу 1 происходить просто действия на клавишу 2 после действия вызывается System.gc()
урезал большую часть кода, теперь данный баг или мою ошибку возможно уловить только при принудительном вызове GC
исходник http://medveduka.ru/flasher/engineertestforflasher.rar
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.KeyboardEvent;
        public class EngineerTestForFlasher extends Sprite
        {
                public function EngineerTestForFlasher()
                {
                        Repository.hero= new Hero;
                        Repository.gamescreen.start();
                        new Maps;
                        stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyboardControl.KeyDown);               
                        stage.addEventListener(KeyboardEvent.KEY_UP,KeyboardControl.KeyUp);       
                        this.addChild(Repository.gamescreen);
                        this.addChild(new FPSMemCounter(0));
                        MapLive.loadMap(Maps.maps[0]);
                }
        }
}

Код AS3:

package
{
        public class Config
        {
                public static var gridLength:int=80;
                public static var gridSize:int=70;
                public static var mapSizeX:int=2880;
                public static var mapSizeY:int=2880;
                public function Config()
                {
                }
        }
}

Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Matrix;
        import flash.geom.Rectangle;
        public class GameScreen extends Sprite
        {
                public static var corpsesData:BitmapData = new BitmapData(Config.mapSizeX,Config.mapSizeY ,true,0);;
                public static var corpses:Bitmap= new Bitmap(corpsesData);
                public static var background:Sprite = new Sprite();
                public static var recForClean:Rectangle = new Rectangle(0,0,Config.mapSizeX,Config.mapSizeY);
                private var matrix:Matrix = new Matrix;
                public function GameScreen()
                {
 
                }
                public function start():void
                {
                        this.addEventListener(Event.ENTER_FRAME,onFrame);
                        this.addChild(background);
                        this.addChild(corpses);
                        this.addChild(Repository.hero);
                }
                private function onFrame(e:Event):void
                {
                        if(Hero.X<=Config.mapSizeX-800/2&&Hero.X>=800/2)
                        {
                                x-=int(Hero.X+x-800/2);
 
                        }
                        if(Hero.Y<=Config.mapSizeY-600/2&&Hero.Y>=600/2)
                        {
                                y-=int(Hero.Y+y-600/2);
 
                        }       
 
                }
 
        }
}

Код AS3:

package
{
        import flash.display.MovieClip;
        import flash.display.Sprite;
        public class Hero extends MovieClip
        {
                public static var X:Number=100;
                public static var Y:Number=100;
                public static var HP:int;
                public static var SPEED:Number=4;
                private var ROTATION:Number=0;
                public static var angle:Number;
                public static var keyLeft:Boolean;
                public static var keyRight:Boolean;
                public static var keyUp:Boolean;
                public static var keyDown:Boolean;
                public static var size:int=15;
 
                public function Hero()
                {
                        this.addEventListener(Event.ENTER_FRAME,onFrame);
                        var img:Sprite = new Sprite;
                        img.graphics.beginFill(0);
                        img.graphics.drawCircle(0,0,size);
                        this.addChild(img);
                        X=100;
                        y=100;
                }
                private function onFrame(e:Event):void
                {
                        ROTATION=-1;
                        if(keyUp)ROTATION=0.5*Math.PI;
                        if(keyLeft)ROTATION=0;
                        if(keyRight)ROTATION=Math.PI;
                        if(keyDown)ROTATION=1.5*Math.PI;
                        if(keyUp&&keyLeft)ROTATION=0.25*Math.PI;
                        if(keyUp&&keyRight)ROTATION=0.75*Math.PI;
                        if(keyDown&&keyLeft)ROTATION=1.75*Math.PI;
                        if(keyDown&&keyRight)ROTATION=1.25*Math.PI;
                        if(ROTATION!=-1)
                        {
                                var nextX:int=X-Math.cos(ROTATION) * SPEED;
                                var nextY:int=Y-Math.sin(ROTATION) * SPEED;
                                X=nextX;
                                Y=nextY;
                        }
                        if(this.x!=X)this.x=X;
                        if(this.y!=Y)this.y=Y;         
                }       
 
        }
}

Код AS3:

package
{
        import flash.events.KeyboardEvent;
        import flash.events.MouseEvent;
        import flash.system.System;
        public class KeyboardControl
        {
                public function KeyboardControl()
                {
                }
                public static function KeyDown(e:KeyboardEvent):void
                {
 
 
 
                        if (e.keyCode==87||e.keyCode==38) Hero.keyUp=true;
                        if (e.keyCode==83||e.keyCode==40) Hero.keyDown=true;
                        if (e.keyCode==65||e.keyCode==37) Hero.keyLeft=true;
                        if (e.keyCode==68||e.keyCode==39) Hero.keyRight=true;
 
                        if(e.keyCode==49)
                        {
                        MapLive.loadMap(Maps.maps[0]);
                        }
                        if(e.keyCode==50)
                        {
                                MapLive.loadMap(Maps.maps[0]);
                                System.gc();
                        }
                }
                public static function KeyUp(e:KeyboardEvent):void
                {
                        if (e.keyCode==87||e.keyCode==38) Hero.keyUp=false;
                        if (e.keyCode==83||e.keyCode==40) Hero.keyDown=false;
                        if (e.keyCode==65||e.keyCode==37) Hero.keyLeft=false;
                        if (e.keyCode==68||e.keyCode==39) Hero.keyRight=false;
                }
 
        }
}

Код AS3:

package
{
        import flash.display.Bitmap;
        import flash.display.MovieClip;
        import flash.events.TimerEvent;
        import flash.geom.Matrix;
        import flash.geom.Rectangle;
        import flash.system.System;
        import flash.utils.Timer;
 
        public class MapLive
        {
                public static var mapLive:MapLive = new MapLive;
                public static var timer:Timer = new Timer(1);
                public static var map:XML;
                private static var ael:Boolean=false;
                public function MapLive()
                {
 
                }
                public static function loadMap(mapForCopy:XML):void
                {
 
                        if(!ael)timer.addEventListener(TimerEvent.TIMER,onTimer);
                        ael=true;
                        timer.reset();
                        timer.start();
                        timer.delay=1;
                        map=mapForCopy.copy();
                        GameScreen.corpsesData.lock();
                        GameScreen.corpsesData.fillRect(new Rectangle(0,0,Config.mapSizeX,Config.mapSizeY),0);
                        GameScreen.corpsesData.unlock();
                        var t:Img_texture= new Img_texture;
                        t.gotoAndStop(int(map.backgroundFill));
                        var bt:Bitmap;
                        bt= t.getChildAt(0)as Bitmap;
                        GameScreen.background.graphics.clear();
                        GameScreen.background.graphics.beginBitmapFill(bt.bitmapData);
                        GameScreen.background.graphics.drawRect(0,0,Config.mapSizeX,Config.mapSizeY);
                        mapForCopy=null;
                        bt=null;
                        t=null;
 
                }
                private static function onTimer(e:TimerEvent):void
                {
                        timer.delay=1000;
                        for  each( var command:XML in map.command)
                        {
 
                                var ifSum:int=0;
                                var ifSumTrue:int=0;
                                for each( var commandIf:XML in command.IF)
                                {
                                        for each( var time:XML in commandIf.time)
                                        {
                                                if(timer.currentCount>int(time))ifSumTrue++
                                        }
                                        ifSum++;
 
                                }
                                if(ifSum==ifSumTrue && command.count>0 &&(timer.currentCount==0||timer.currentCount%command.interval==0||command.interval==0))
                                {
 
 
                                        for each(var addBackgroundUp:XML in command.addBackgroundUp)
                                        {
                                                var b:MovieClip = new Img_backgroundUp();
                                                b.gotoAndStop(int(addBackgroundUp.type));
                                                var m:Matrix= new Matrix();
                                                m.rotate(addBackgroundUp.angle * Math.PI/180);
                                                m.translate(addBackgroundUp.x,addBackgroundUp.y);
                                                GameScreen.corpses.bitmapData.lock();
                                                GameScreen.corpses.bitmapData.draw(b,m);
                                                GameScreen.corpses.bitmapData.unlock();
                                                command.count=int(command.count)-1;
                                                b=null;
                                                m=null;
                                        }
 
                                }
 
                        }
 
                }
 
        }
}

Код AS3:

package
{
        public class Maps
        {
                public static var maps:Array = new Array;
 
                public function Maps()
                {
 
maps[0]=<map>
          <backgroundFill>1</backgroundFill>
          <command>
                <interval>1</interval>
                <count>1</count>
                <addBackgroundUp>
                  <x>100</x>
                  <y>100</y>
                  <angle>90</angle>
                  <type>1</type>
                  <id>1</id>
                </addBackgroundUp>
          </command>
          <command>
                <interval>1</interval>
                <count>1</count>
                <addBackgroundUp>
                  <x>100</x>
                  <y>200</y>
                  <angle>90</angle>
                  <type>1</type>
                  <id>1</id>
                </addBackgroundUp>
          </command>
          <command>
                <interval>1</interval>
                <count>1</count>
                <addBackgroundUp>
                  <x>300</x>
                  <y>200</y>
                  <angle>90</angle>
                  <type>1</type>
                  <id>1</id>
                </addBackgroundUp>
          </command>
</map>
                }
        }
}

Код AS3:

package
{
        public class Repository
        {
                public static var hero:Hero= new Hero;
                public static var gamescreen:GameScreen= new GameScreen;
                public function Repository()
                {
                }
        }
}


medvedya2 31.10.2010 01:22

Еще код урезал теперь для System.gc() нажать 1 и начинает работать мелено.
Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.KeyboardEvent;
        import flash.events.ProgressEvent;
        public class EngineerTestForFlasher extends Sprite
        {
                public function EngineerTestForFlasher()
                {
                        Repository.hero= new Hero;
                        Repository.gamescreen.start();
                        stage.addEventListener(KeyboardEvent.KEY_DOWN,KeyboardControl.KeyDown);               
                        stage.addEventListener(KeyboardEvent.KEY_UP,KeyboardControl.KeyUp);       
                        this.addChild(Repository.gamescreen);
                        this.addChild(new FPSMemCounter(0));
 
                }
        }
}

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
 
 
        public class GameScreen extends Sprite
        {
 
                public function GameScreen()
                {
 
                }
                public function start():void
                {
                        this.addChild(Repository.hero);
                }
 
        }
}

Код AS3:

package
{
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
 
        public class Hero extends MovieClip
        {
                public static var X:Number=100;
                public static var Y:Number=100;
                public static var HP:int;
                public static var SPEED:Number=4;
                private var ROTATION:Number=0;
                public static var angle:Number;
                public static var keyLeft:Boolean;
                public static var keyRight:Boolean;
                public static var keyUp:Boolean;
                public static var keyDown:Boolean;
                public static var size:int=15;
 
                public function Hero()
                {
                        this.addEventListener(Event.ENTER_FRAME,onFrame);
                        var img:Sprite = new Sprite;
                        img.graphics.beginFill(0);
                        img.graphics.drawCircle(0,0,size);
                        this.addChild(img);
                        X=100;
                        y=100;
                }
                private function onFrame(e:Event):void
                {
                        ROTATION=-1;
                        if(keyUp)ROTATION=0.5*Math.PI;
                        if(keyLeft)ROTATION=0;
                        if(keyRight)ROTATION=Math.PI;
                        if(keyDown)ROTATION=1.5*Math.PI;
                        if(keyUp&&keyLeft)ROTATION=0.25*Math.PI;
                        if(keyUp&&keyRight)ROTATION=0.75*Math.PI;
                        if(keyDown&&keyLeft)ROTATION=1.75*Math.PI;
                        if(keyDown&&keyRight)ROTATION=1.25*Math.PI;
                        if(ROTATION!=-1)
                        {
                                var nextX:int=X-Math.cos(ROTATION) * SPEED;
                                var nextY:int=Y-Math.sin(ROTATION) * SPEED;
                                X=nextX;
                                Y=nextY;
                        }
                        if(this.x!=X)this.x=X;
                        if(this.y!=Y)this.y=Y;         
                }       
 
        }
}

Код AS3:

package
{
        import flash.events.KeyboardEvent;
        import flash.system.System;
        import flash.text.TextField;
 
        public class KeyboardControl
        {
                public function KeyboardControl()
                {
                }
                public static function KeyDown(e:KeyboardEvent):void
                {
 
 
 
                        if (e.keyCode==87||e.keyCode==38) Hero.keyUp=true;
                        if (e.keyCode==83||e.keyCode==40) Hero.keyDown=true;
                        if (e.keyCode==65||e.keyCode==37) Hero.keyLeft=true;
                        if (e.keyCode==68||e.keyCode==39) Hero.keyRight=true;
 
                        if(e.keyCode==49)
                        {
                                System.gc();
                        }
 
                }
                public static function KeyUp(e:KeyboardEvent):void
                {
                        if (e.keyCode==87||e.keyCode==38) Hero.keyUp=false;
                        if (e.keyCode==83||e.keyCode==40) Hero.keyDown=false;
                        if (e.keyCode==65||e.keyCode==37) Hero.keyLeft=false;
                        if (e.keyCode==68||e.keyCode==39) Hero.keyRight=false;
                }
 
        }
}

Код AS3:

package
{
        public class Repository
        {
                public static var hero:Hero= new Hero;
                public static var gamescreen:GameScreen= new GameScreen;
                public function Repository()
                {
                }
        }
}

Самое интересное что таймер работает корректно!
Видимо индусы перестарались с ENTER_FRAME

koIIImarik 01.11.2010 02:03

Если не секрет, для какого приложения вы используете System.gc()? Просто совсем недавно узнал про этот метод и увидел, что в его описании значится следующее:
Цитата:

For the Flash Player debugger version and AIR applications only
Т.е. это означает, что данный метод будет работать только в дебаг версии плеера или AIR приложениях, причём для AIR приложений там тоже примечания есть.

medvedya2 04.11.2010 03:01

Цитата:

Т.е. это означает, что данный метод будет работать только в дебаг версии плеера или AIR приложениях, причём для AIR приложений там тоже примечания есть.
да он создан чтоб отлаживать находить утечки в коде, или баги после срабатывания gc
gc не идеален
с помощью этого метода я нашел из за чего баг при а аппаратном ускорение, и как его обойти.


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

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