Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.10.2010, 07:23
medvedya2 вне форума Посмотреть профиль Отправить личное сообщение для medvedya2 Найти все сообщения от medvedya2
  № 1  
Ответить с цитированием
medvedya2

Регистрация: Mar 2010
Сообщений: 128
По умолчанию После срабатывания 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;	
		}
	}
}


Последний раз редактировалось medvedya2; 30.10.2010 в 07:41.
Старый 30.10.2010, 10:08
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 2  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,601
Записей в блоге: 17
Флешку в студию с минимализированным примером, а не тучей мусора, который к теме не относится.

Старый 31.10.2010, 00:04
medvedya2 вне форума Посмотреть профиль Отправить личное сообщение для medvedya2 Найти все сообщения от medvedya2
  № 3  
Ответить с цитированием
medvedya2

Регистрация: Mar 2010
Сообщений: 128
Флешка 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 в 00:29.
Старый 31.10.2010, 01:22
medvedya2 вне форума Посмотреть профиль Отправить личное сообщение для medvedya2 Найти все сообщения от medvedya2
  № 4  
Ответить с цитированием
medvedya2

Регистрация: Mar 2010
Сообщений: 128
Еще код урезал теперь для 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


Последний раз редактировалось medvedya2; 31.10.2010 в 01:35.
Старый 01.11.2010, 02:03
koIIImarik вне форума Посмотреть профиль Отправить личное сообщение для koIIImarik Посетить домашнюю страницу koIIImarik Найти все сообщения от koIIImarik
  № 5  
Ответить с цитированием
koIIImarik
 
Аватар для koIIImarik

Регистрация: Jul 2007
Адрес: Россия, Москва
Сообщений: 522
Если не секрет, для какого приложения вы используете System.gc()? Просто совсем недавно узнал про этот метод и увидел, что в его описании значится следующее:
Цитата:
For the Flash Player debugger version and AIR applications only
Т.е. это означает, что данный метод будет работать только в дебаг версии плеера или AIR приложениях, причём для AIR приложений там тоже примечания есть.

Старый 04.11.2010, 03:01
medvedya2 вне форума Посмотреть профиль Отправить личное сообщение для medvedya2 Найти все сообщения от medvedya2
  № 6  
Ответить с цитированием
medvedya2

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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