2015-01-30 3 views
0

저는 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; 
      } 
+2

찾을 대상 : 너무 많은 개체 생성, 리소스 재사용, GC 순환 필링, 제거되지 않은 수신기, 너무 많은 enterframe 사용, 너무 많은 타이머 등 ... – BotMaster

+2

이것은 StackOverflow에 너무 광범위합니다. 시도해보고 범위를 좁히고 범인이라고 생각하는 코드를 보여줍니다. 이벤트 리스너를 제거하고 (또는 약한 참조로 만드십시오.) 자식을 제거하지 않는 것이 메모리 누수의 가장 일반적인 원인입니다. Grant Skinner는 쓰레기 수거에 관한 훌륭한 기사를 갖고 있습니다. http://blog.gskinner.com/archives/2006/06/as3_resource_ma.html – BadFeelingAboutThis

+1

스카우트를 사용할 수 없습니까? – moot

답변

0

그래서 내가 무슨 짓을했는지에 상관없이 작동하는 어도비 스카우트를 가져올 수 없습니다. 그러나 나는 그 문제를 해결했다. 도와 줄 사람 : 'trace (System.totalMemory);'를 추가했습니다. 문서 클래스에서 'ENTER_FRAME 함수 안에서, 내 응용 프로그램이 얼마나 많은 메모리를 사용하고 있는지 알 수있게되었습니다. 태초에 양은 끊임없이 증가했습니다. 모든 eventlisteners를 메인 클래스에서 가장 적합한 클래스로 옮겼습니다. 예를 들어, 'gamePanel.jetButton.addEventListener (MouseEvent.MOUSE_DOWN, jetPackUp)'를 gamePanel 클래스로 옮겼습니다. gamePanel 클래스 내부에서 메인 클래스를 참조하려면 'MovieClip (parent)'코드를 사용했습니다.someFunction() ' 이제는 메모리를 계속 사용하지 않는 안정적인 앱을 가지고 있습니다. 난 그냥 같은 개체의 인스턴스를 더 추가해야 할 때 메모리 누수가 발생하는 내 for 루프와 함께 할 일을 알아낼 필요가.하지만 '개체 풀링'이 해결할 것 같아요.

0

는 물론 메모리가 사용되는 방식을 볼 수 스카우트를 사용합니다.

다음은 인스턴스가 있어야 할 때 메모리에서 해제되고 있는지 확인하는 데 사용할 수있는 훌륭한 메모리 추적 클래스입니다.

http://divillysausages.com/blog/tracking_memory_leaks_in_as3

+0

고마워요! 난 그냥 최신 공기 SDK를 변경하면 안드로이드에 대한 플래시 sc6 공기 고급 telematry를 활성화 할 수 없습니다 .. 옵션은 게시 설정 아래에없고 swf 고급 아래에 있습니다. 다른 방법이 있습니까? – Jens

+0

명령 줄에서 앱을 게시하고 속성을 수동으로 설정할 수 있습니다. http://help.adobe.com/en_US/flex/mobileapps/WS19f279b149e7481c-24dc70c812b9cbf7285-8000.html – crooksy88