![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Mar 2010
Сообщений: 128
|
У меня в приложение память потихоньку растет наступает определённый момент и gc срабатывает и очищает всю память, если перед моментом срабатывание gc происходят сложные много занимающие в памяти процессы то после gc ENTER_FRAME ведет себя некорректно работает в 2 раз реже, FPS(50) не падает, Wmode=gpu , проверял на 3 компьютерах, уже 3 день бьюсь над это проблемой.
Если не указать Wmode=gpu или Wmode=derect то ENTER_FRAME всегда работает мелено 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; } } } Последний раз редактировалось medvedya2; 30.10.2010 в 07:41. |
|
|||||
|
Флешку в студию с минимализированным примером, а не тучей мусора, который к теме не относится.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
|
Регистрация: Mar 2010
Сообщений: 128
|
Флешка http://medveduka.ru/flasher/engineertestforflasher.html запускать через дебуг плеер.
на клавишу 1 происходить просто действия на клавишу 2 после действия вызывается System.gc() урезал большую часть кода, теперь данный баг или мою ошибку возможно уловить только при принудительном вызове GC исходник http://medveduka.ru/flasher/engineertestforflasher.rar 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]); } } } 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() { } } } 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); } } } } 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; } } } 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; } } } 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; } } } } } } 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> } } } Последний раз редактировалось medvedya2; 31.10.2010 в 00:29. |
|
|||||
|
Регистрация: Mar 2010
Сообщений: 128
|
Еще код урезал теперь для System.gc() нажать 1 и начинает работать мелено.
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)); } } } 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); } } } 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; } } } 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; } } } package { public class Repository { public static var hero:Hero= new Hero; public static var gamescreen:GameScreen= new GameScreen; public function Repository() { } } } Видимо индусы перестарались с ENTER_FRAME Последний раз редактировалось medvedya2; 31.10.2010 в 01:35. |
|
|||||
|
Регистрация: Jul 2007
Адрес: Россия, Москва
Сообщений: 522
|
Если не секрет, для какого приложения вы используете System.gc()? Просто совсем недавно узнал про этот метод и увидел, что в его описании значится следующее:
Цитата:
|
|
|||||
|
Регистрация: Mar 2010
Сообщений: 128
|
Цитата:
gc не идеален с помощью этого метода я нашел из за чего баг при а аппаратном ускорение, и как его обойти. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:25. |
|
|
« Предыдущая тема | Следующая тема » |
|
|