2011-08-12 4 views
0

코드 실행에 걸리는 평균 시간과 각 프레임이 Flex 어플리케이션에서 렌더링되는 데 걸리는 시간을 측정하는 방법이 있습니까? 좀 더 구체적으로 말하면, getTimer()를 사용하는 방법을 알고 있지만 이것을 수행하기 위해 어떤 이벤트를 청취해야하는지 잘 모르겠습니다. this post을 읽었을 때 실제 렌더링이 얼마나 오래 걸리는지 알 수없는 방법입니다 (렌더러 이벤트 발생과 다음 ENTER_FRAME 이벤트 발생 사이의 시간이 될 수도 있지만 확실하지는 않습니다). 또한 사용자 코드가 어디에서 발생하는지 정확히 알지 못하거나 EXIT_FRAME 및 FRAME_CONSTRUCTED에 대해 신경을 써야하는지 여부는 확실하지 않습니다.코드 실행의 다양한 단계를 측정하십시오.

많은 도움을 주셨습니다.

편집 ----

여기에 슈퍼 간단한 플렉스 응용 프로그램의 두 번째 프레임의 각 반복의 주요 이벤트를 보여주는 코드 조각입니다. 내가 알아 내려고하는 것은 고전적인 Flex 경마장의 "사용자 코드"와 "렌더링"부분과 내가 추적하고있는 네 가지 주요 신호 사이의 간격 사이에 명확한 관계가 있는지 여부입니다.

코드 :

<?xml version="1.0" encoding="utf-8"?> 
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> 

    <fx:Script> 
     <![CDATA[ 
      import flash.utils.getTimer; 

      public var t:Timer; 
      protected function button1_clickHandler(event:MouseEvent):void 
      { 
       t = new Timer(40, 50); 
       t.addEventListener(TimerEvent.TIMER, handleTimeTick); 
       t.addEventListener(TimerEvent.TIMER_COMPLETE, timerDone); 
       addEventListener(Event.RENDER, application1_renderHandler); 
       addEventListener(Event.ENTER_FRAME, application1_enterFrameHandler); 
       addEventListener(Event.EXIT_FRAME, application1_exitFrameHandler); 
       addEventListener(Event.FRAME_CONSTRUCTED, application1_frameConstructedHandler); 
       t.start(); 
      } 

      protected function handleTimeTick(e:TimerEvent):void 
      { 
       shape.x += 5; 
      } 

      protected function timerDone(e:TimerEvent):void 
      { 
       t.stop(); 
       t.removeEventListener(TimerEvent.TIMER, handleTimeTick); 
       t.removeEventListener(TimerEvent.TIMER_COMPLETE, timerDone); 
       removeEventListener(Event.RENDER, application1_renderHandler); 
       removeEventListener(Event.ENTER_FRAME, application1_enterFrameHandler); 
       removeEventListener(Event.EXIT_FRAME, application1_exitFrameHandler); 
       removeEventListener(Event.FRAME_CONSTRUCTED, application1_frameConstructedHandler); 
      } 

      protected function application1_renderHandler(event:Event):void 
      { 
       trace("render fire", getTimer()); 
      } 

      protected function application1_enterFrameHandler(event:Event):void 
      { 
       trace("enter frame fire", getTimer()); 
      } 

      protected function application1_exitFrameHandler(event:Event):void 
      { 
       trace("exit frame fire", getTimer()); 
      } 

      protected function application1_frameConstructedHandler(event:Event):void 
      { 
       trace("frame constructed fire", getTimer()); 
      } 

     ]]> 
    </fx:Script> 


    <s:Rect id="shape" x="0" y="0" height="20" width="20"> 
     <s:fill> 
      <s:SolidColor color="0xff0000"/> 
     </s:fill> 
    </s:Rect> 

    <s:Button x="10" y="100" click="button1_clickHandler(event)" label="go"/> 
</s:Application> 
+0

나는 이것에 대한 답을 알고 싶다. 나는 누가 그랬는지 알고있다. ** Kirupa ** 플래시 포럼에서 답변을 찾으십시오. ** Senocular **는 짐승이다. – Jacksonkr

답변

0

확인, 웹 주위에 많이 읽은 후 나는 this presentation 탄성 레이스 트랙 시간 (프리젠 테이션에서 예를 this piece of code 참조)을 측정하는 방법에 대한 최선의 정보를 제공합니다 생각합니다.

1

어떤 플렉스 응용 프로그램은 두 개의 프레임이다. 첫 번째 프레임은 프레임 워크의 시작/초기화이고 두 번째 프레임은 앱입니다.

framerate은 Flex 응용 프로그램 태그에 설정되며 기본값은 초당 24 프레임입니다. 따라서 응용 프로그램의 프레임을 렌더링하는 데 Flex가 1/24 초가 걸립니다.

그러나 코드에서 실행하기 위해 하나 이상의 프레임이 필요하다는 것을 전적으로 알고있을 것입니다. 나는 그것이 여러분이 측정하기를 원하는 것이라고 생각합니다.

일부 배경 정보를 보려면 Flex Elastic Racetrack을 조사하여 Flex가 각 처리 유형별로 프레임을 구분하는 방법을 조사해야합니다.

아직 읽지 않은 경우, Flex Component LifeCycle에 대해 읽으십시오. (Flex 3 Version).

이미 getTimer() 방법을 언급했습니다. 요점은 두 점에서 getTimer()를 사용하여 두 값을 비교하는 것입니다. 이 두 가지 사항은 전적으로 당신이 측정하고 싶은 것에 달려 있습니다.

Flex 구성 요소가 시작 프로세스를 통과하는 데 걸리는 시간을 측정하려면 생성하기 전에 getTimer()를 사용하고 (새 AKA Component()) 해당 구성 요소의 creationComplete 이벤트에 대한 수신기에서 사용하십시오.

전체 응용 프로그램 설정 시간을 맞추고 싶다면 기본 응용 프로그램 태그의 preinitialize 이벤트 처리기와 동일한 태그의 applicationComplete 처리기에서 값을 얻는 것이 가장 좋습니다.

도움이 되었습니까?

+0

차가움. 그래서 당신이 게시 한 다양한 링크를 읽고 이론적 인 것과는 달리 실제 렌더링 시간을 측정 할 수있는 방법이 있는지 궁금해했습니다. 이는 사용자 코드가 너무 오래 걸리면 보장 될 것 같지 않습니다. 나는 렌더가 해고 될 때와 그 밖의 것이 트릭을 할 때 사이의 getTimer()를 가정 할 것이지만, 그 다른 무엇이 무엇인지 모르겠습니다. 어떤 아이디어? –

+0

또한 왜 두 프레임에서 메모를 고려하고 있는지 잘 모르겠지만 설정된 렌더링 속도에 대해 ENTER_FRAME 이벤트가 발생합니다. –

+0

@ fred 8 월 무엇의 렌더링 시간을 원하십니까? 나는 "실제"렌더링 시간 대 "이론적"렌더링 시간을 당신이 무엇이라고 부르는 지 잘 모르겠습니다. Flex App re 프레임 속도에 따라 계속해서 "두 번째 프레임"을 실행합니다. 프레임/타임 라인 기반은 완전히 플래시 도구를 사용하여 마스킹됩니다. "ENTER_FRAME"을 (를) 사용하려는 것이 확실하지 않습니다. – JeffryHouser

2

"프레임"을 실행하는 데 소요되는 시간을 테스트하는 쉬운 방법입니다. 여기에 간단한 예가 있습니다. 이것은 테스트되지 않았지만 아이디어를 얻습니다. Grant Skinners talk about performance 및 프레임 속도도 확인해야합니다.

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" 
       xmlns:parsley="http://www.spicefactory.org/parsley" 
       creationComplete="onCreationComplete()"> 
    <fx:Script> 
     <![CDATA[ 
      private var _timer:Timer = new Timer(1000); 
      private var _previousTime:int; 
      private var _avgTime:int; 
      private var _times:Array = []; 

      private function onCreationComplete():void 
      { 
       // Add event listener for enter frame 
       this.addEventListener(Event.ENTER_FRAME, onEnterFrame); 
       // Listen to timer 
       this._timer.addEventListener(TimerEvent.TIMER, onTimer); 
       // start timer 
       this._timer.start(); 
      } 

      private function onEnterFrame(e:Event):void 
      { 
       var time:int = getTimer() - this._previousTime; 
       trace("timer frame took "+ time +"ms"); 
       this._previousTime = getTimer(); 
       this._times.push(time); 
      } 

      private function onTimer(e:Event):void 
      { 
       var total:int = 0; 
       for(var i:uint = 0, len:uint = this._times.length; i < len ; i++) 
       { 
        total += this._times[i]; 
       } 
       this._avgTime = total/len; 
       this._times = []; 

       trace("Average frame time is "+ this._avgTime +"ms"); 
      } 
     ]]> 
    </fx:Script> 
</s:Application> 
관련 문제