저는 Flash Professional에 앱을 제작하고 있습니다. 기본적으로 고급 avoider 게임입니다. 일부 오브젝트가 생성되고 캐릭터를 촬영하는 등의 작업을 수행합니다. 내 모바일에서 앱을 열면 앱이 원활하게 실행되지만 잠시 후 눈에 띄게 느리게 실행되며별로 성가시다. 레벨을 지울 때 모든 객체가 삭제되도록 removeChild를 사용할 때는주의해야합니다.안드로이드 애플리케이션 용 에어는 잠시 후에 느리게 실행됩니다. 어떻게해야합니까?
처음에는 지연이 없으므로 메모리 누수가 발생할 것으로 예상됩니까? 그리고 어떻게 할 것인가? 가비지 수집을 사용해야하며 스카우트 또는 플래시 빌더로 앱을 분석 할 수 있습니까? 좋은 자습서 ?? 사전에 감사
// _______________________ 전혀 다른 이벤트 리스너 ______________________
addEventListener(Event.ENTER_FRAME, moveWorld)
mainMenu.PlayButton.addEventListener(MouseEvent.CLICK, gotoWorldMap)
mainMenu.closebutton.addEventListener(MouseEvent.CLICK, closeAppdown)
gamePanel.jetButton.addEventListener(MouseEvent.MOUSE_DOWN, jetPackUp)
gamePanel.jetButton.addEventListener(MouseEvent.MOUSE_UP, jetPackStop)
gamePanel.jumpButton.addEventListener(MouseEvent.MOUSE_DOWN, startJumping)
gamePanel.jumpButton.addEventListener(MouseEvent.MOUSE_UP, stopSwimming)
gameOverScreen.RestartButton.addEventListener(MouseEvent.CLICK, restartLevel)
gameOverScreen.backtoMenu.addEventListener(MouseEvent.CLICK, backtoWorldMap)
nextLevel.nextLevelButton.addEventListener(MouseEvent.CLICK, gotoNextLevel)
nextLevel.backtoWorldMap.addEventListener(MouseEvent.CLICK, backworldMap)
pauseScreen.continueButton.addEventListener(MouseEvent.CLICK, continueGame)
wannaLeave.YesEndGame.addEventListener(MouseEvent.CLICK, endingGame)
wannaLeave.backToMain.addEventListener(MouseEvent.CLICK, goingMain)
// __________________________
worldMap.buttonWorld1.addEventListener(MouseEvent.CLICK, gotoWorld1)
...etc...
worldMap.buttonWorld27.addEventListener(MouseEvent.CLICK, gotoWorld27)
NativeApplication.nativeApplication.addEventListener(KeyboardEvent.KEY_DOWN,checkKeypress);
// _________________________ 것들에 대한 루프를 들어 각각의 수준 _____________에 보내 다른 버튼에 대한 이벤트 리스너가 배열에 있음 _________________________
for (var l:int = 0; l<14; l++)
{
var lavaThing:LavaThing = new LavaThing;
lavas.push(lavaThing);
}
for (var v:int = 0; v<14; v++)
{
var upsideVolcano:UpsideVolcano = new UpsideVolcano;
volcanos.push(upsideVolcano);
}
for (var j:int = 0; j<7; j++)
{
var jetFuel:JetFuel = new JetFuel;
fuels.push(jetFuel);
}
for (var m:int = 0; m<3; m++)
{
var monster:Monster = new Monster;
monsterArmy.push(monster);
}
}
// _________________ 세상이 _______ 위험 등 ...와 함께 오른쪽 프레임에
public function gotoWorld()
{
isonWorldMap = false;
isinGame = true;
addChild(backGround);
backGround.x = 0;
backGround.y = 0;
addChild(backGroundPlanet);
backGroundPlanet.x = 0;
backGroundPlanet.y = 0;
addChild(world);
world.x = 0;
world.y = 0;
isinWorld = true
addChild(character);
character.x = 100;
character.y = 350;
character.gotoAndStop(3);
addChild(gamePanel);
addChild(fuelBar);
fuelBar.x = 521.85;
fuelBar.y = 492.6;
if (currentLevel<12)
{
Different movespeed
}else if (currentLevel>11)
{
Different Movespeed
}
if (currentLevel == 1)
{
world.worldDangers.gotoAndStop(1);
world.SafeGround.gotoAndStop(1);
world.GroundViz.gotoAndStop(1);
world.PortaltoNew.gotoAndStop(1);
world.Water.gotoAndStop(1);
character.scaleY = 1;
character.scaleX = 1;
world.GroundViz.addChild(fuels[0])
fuels[0].x = 307.15;
fuels[0].y = -1855.75;
maxStamina = 500;
stamina = 0;
}
...etc...
}else if (currentLevel == 12)
{
world.worldDangers.gotoAndStop(12);
world.SafeGround.gotoAndStop(12);
world.GroundViz.gotoAndStop(12);
world.PortaltoNew.gotoAndStop(12);
world.Water.gotoAndStop(12);
character.scaleY = 0.7;
character.scaleX = 0.7;
world.worldDangers.addChild(lavas[0])
world.worldDangers.addChild(lavas[1])
world.worldDangers.addChild(lavas[2])
world.worldDangers.addChild(lavas[3])
world.worldDangers.addChild(lavas[4])
world.worldDangers.addChild(lavas[5])
lavas[0].x = 83.3;
lavas[0].y = -356.8;
lavas[0].rotation = -10
lavas[1].x = 118;
lavas[1].y = -130.95;
lavas[2].x = -3373;
lavas[2].y = -4433;
lavas[3].x = -3373;
lavas[3].y = -4773;
lavas[4].x = -3373;
lavas[4].y = -5068;
lavas[5].x = -3373;
lavas[5].y = -5408;
world.GroundViz.addChild(fuels[0])
world.GroundViz.addChild(fuels[1])
world.GroundViz.addChild(fuels[2])
world.GroundViz.addChild(fuels[3])
world.GroundViz.addChild(fuels[4])
fuels[0].x = 335.65;
fuels[0].y = 163.55;
fuels[1].x = -77.65;
fuels[1].y = -976.45;
fuels[2].x = -1292.1;
fuels[2].y = -1686.9;
fuels[3].x = -2343.05;
fuels[3].y = -2696.05;
fuels[4].x = -3034.2;
fuels[4].y = -3861.75;
maxStamina = 500;
stamina = 0;¨
...etc...
}else if (currentLevel == 13)
{
world.worldDangers.gotoAndStop(13);
world.SafeGround.gotoAndStop(13);
world.GroundViz.gotoAndStop(13);
world.PortaltoNew.gotoAndStop(13);
world.Water.gotoAndStop(13);
character.scaleY = 0.7;
character.scaleX = 0.7;
world.worldDangers.addChild(lavas[0])
world.worldDangers.addChild(lavas[1])
world.worldDangers.addChild(lavas[2])
world.worldDangers.addChild(lavas[3])
world.worldDangers.addChild(lavas[4])
world.worldDangers.addChild(lavas[5])
world.worldDangers.addChild(lavas[6])
world.worldDangers.addChild(lavas[7])
lavas[0].x = -2535.75;
lavas[0].y = -2614.5;
lavas[1].x = -2535.75;
lavas[1].y = -2809.6;
lavas[2].x = -2535.75;
lavas[2].y = -3019.7;
lavas[3].x = -2535.75;
lavas[3].y = -3219.8;
lavas[4].x = -2790.9;
lavas[4].y = -4770.65;
lavas[5].x = -2790.9;
lavas[5].y = -4985;
lavas[6].x = -2790.9;
lavas[6].y = -5195.85;
lavas[7].x = -2790.9;
lavas[7].y = -5421;
world.GroundViz.addChild(fuels[0])
world.GroundViz.addChild(fuels[1])
world.GroundViz.addChild(fuels[2])
world.GroundViz.addChild(fuels[3])
world.GroundViz.addChild(fuels[4])
fuels[0].x = 335.6;
fuels[0].y = 66;
fuels[1].x = -652.2;
fuels[1].y = -1031.3;
fuels[2].x = -2051.15;
fuels[2].y = -2022.45;
fuels[3].x = -2165.8;
fuels[3].y = -3174;
fuels[4].x = -1547.05;
fuels[4].y = -4138.65;
maxStamina = 500;
stamina = 0;
}
...etc...
else if (currentLevel == 27)
{
world.worldDangers.gotoAndStop(27);
world.SafeGround.gotoAndStop(27);
world.GroundViz.gotoAndStop(27);
world.PortaltoNew.gotoAndStop(27);
world.Water.gotoAndStop(27);
character.scaleY = 0.7;
character.scaleX = 0.7;
world.GroundViz.addChild(monsterArmy[0])
monsterArmy[0].x = 1029.75;
monsterArmy[0].y = -7823.5;
maxStamina = 2500;
stamina = 2500;
}
}
// ___________________ 문자가 위험 안타 때 호출 기능 ______________
public function charDies()
{
addChild(gameOverScreen);
world.parent.removeChild(world);
backGround.parent.removeChild(backGround);
backGroundPlanet.parent.removeChild(backGroundPlanet);
character.parent.removeChild(character);
gamePanel.parent.removeChild(gamePanel);
isinWorld = false;
isinWater = false;
jetIsBeingPressed = false;
isinGame = false;
jumping = false;
//____________________ Removes all the monsters, and volcano obstacles etc....
for (var h = 0; h < lavas.length; h++) {
if (lavas[h].parent) { //check to see if this item has a parent
lavas[h].parent.removeChild(lavas[h]); //tell the parent to remove this child
}
}
for (var v = 0; v < volcanos.length; v++) {
if (volcanos[v].parent) { //check to see if this item has a parent
volcanos[v].parent.removeChild(volcanos[v]); //tell the parent to remove this child
}
}
for (var j = 0; j < fuels.length; j++) {
if (fuels[j].parent) { //check to see if this item has a parent
fuels[j].parent.removeChild(fuels[j]); //tell the parent to remove this child
}
}
for (var m = 0; m < monsterArmy.length; m++) {
if (monsterArmy[m].parent) { //check to see if this item has a parent
monsterArmy[m].parent.removeChild(monsterArmy[m]); //tell the parent to remove this child
System.pauseForGCIfCollectionImminent()
}
}
}
// ________________ 차종을 이동 확인 레벨을 다시 시도 할 수있는 플레이어 _____________________
function restartLevel (m:MouseEvent):void
{
gameOverScreen.parent.removeChild(gameOverScreen);
gotoWorld()
}
// _________________ 레벨 버튼 ______________________
function gotoWorld1 (m:MouseEvent):void
{
currentLevel = 1;
worldMap.parent.removeChild(worldMap);
gotoWorld();
}
...etc...
function gotoWorld27 (m:MouseEvent):void
{
currentLevel = 27;
worldMap.parent.removeChild(worldMap);
gotoWorld();
}
// ___________________________ MOVE 세계는 _____________________________
function moveWorld (e:Event)
{
trace(System.totalMemory);
if (isinWorld)
{
world.x -= worldMoveSpeed;
backGroundPlanet.x -= 0.3;
if (backGroundPlanet.x < -300)
{
backGroundPlanet.x = -300;
}
찾을 대상 : 너무 많은 개체 생성, 리소스 재사용, GC 순환 필링, 제거되지 않은 수신기, 너무 많은 enterframe 사용, 너무 많은 타이머 등 ... – BotMaster
이것은 StackOverflow에 너무 광범위합니다. 시도해보고 범위를 좁히고 범인이라고 생각하는 코드를 보여줍니다. 이벤트 리스너를 제거하고 (또는 약한 참조로 만드십시오.) 자식을 제거하지 않는 것이 메모리 누수의 가장 일반적인 원인입니다. Grant Skinner는 쓰레기 수거에 관한 훌륭한 기사를 갖고 있습니다. http://blog.gskinner.com/archives/2006/06/as3_resource_ma.html – BadFeelingAboutThis
스카우트를 사용할 수 없습니까? – moot