혹시 이 문제 해결하신분 계신가요?
Is anybody know this problem?

코드는 다음과 같습니다.
See the following.

import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.events.MouseEvent;
import flash.utils.getTimer;

var timer: Timer = new Timer( 3 * 1000, 2 );
timer.addEventListener( TimerEvent.TIMER, tick );
timer.addEventListener( TimerEvent.TIMER_COMPLETE, complete );
timer.start();

var time: int = getTimer();

trace( "start : " + time );

function tick( $e: TimerEvent ): void
{
     trace( "tick : " + ( getTimer() - time ) );
}

function complete( $e: TimerEvent ): void
{
     trace( "complete" + ( getTimer() - time ) );
}

this.stage.addEventListener( MouseEvent.CLICK, click );

function click( $e: MouseEvent ): void
{
     this.stage.frameRate = 0.1;
    
     trace( "frame rate!!" );
}

문제는 이겁니다.
Here is a problem.

Timer 는 delay를 3초로 맞춰놓고 두번 돌게 되어 있습니다.
Timer was set to 3 second delay for twice.

근데 그 사이에 frame rate을 변경시키면 타이머가 제시간에 움직이지 않습니다.
But if you change frame rate during timer is working, it doesn't tick at correct delay.

혹시 이 문제 경험하시거나 해결법 아시는 분 계신가요?
Is there anybody who knows the solution or expirenced?
저작자 표시 비영리 동일 조건 변경 허락
신고
  1. synchrong 2011.05.26 20:30 신고

    애당초 인자로 넣는 3초라는게...
    "대략 3초 간격으로 호출됬으면 좋겠다." 라는 희망사항인 거지,
    "틀림없이 그 3초 간격으로 호출된다," 라는 보장은 아닐것임.

  2. Favicon of http://jidolstar.tistory.com 지돌스타 2011.05.26 23:44 신고

    원래 거의 불가능한 일인데... ㅎㅎㅎ
    싱글스레드 사용하는 flash에서는 더욱이 더 그렇구...
    멀티스레드가 지원되는 차세대 flash player가 나온다고 하더라도 완벽히는 되지 못함
    왜냐하면 우리들의 OS는 시분할로 여러 프로세스를 돌리고 있기 때문에 원래 안됨
    가령, 예전에 모터의 PWM을 측정하기 위해 드라이버에서 전달하는 펄스를 측정해 컴퓨터에서 보는 형태로 만든적이 있었는데 응용프로그램에서는 그 값이 최소 10ms 내로 맞추는게 불가능했었지. 그때 비로소 아~ 당연히 안되는것을 뻘짓했구나 깨달음

    • Favicon of http://wooyaggo.tistory.com 우야꼬  2011.05.27 00:36 신고

      아 저는 기대하는게 정확성보다는
      타이머의 시간이 frame rate의 영향을 받아서 전혀 엉뚱한게 돌아버리니까
      모션이나 이런게 엉망이 되버리더라구요.
      저는 타이머가 frame rate과 상관이 있을 줄은 몰랐는데 한방 맞은거 같아여 ㅠ.ㅠ
      가령 3000ms로 줬는데 frame rate이 변하면 1200ms로 돌아버리니까 환장하는거죠 ㅠ.ㅠ

  3. Favicon of http://diebuster.com hika 2011.05.27 13:44 신고

    본질적으로 야꼬의 질문에 대한 답은 나도 잘 모르겠다. 아마도 프레임레이트는 모든 영향을 다 줄지도 몰라. 하지만 내가 정확하게 아는건 프레임레이트를 런타임에 변경하면 120프레임에서 30프레임으로 확변하는게 아니라 갑자기 그 여파로 시스템전체에 영향을 끼쳐서 120->60->30 처럼 30에 수렴할때도 있고 120->100->30으로 수렴할때도 있고 심지어 120->50->100->30 처럼 불규칙하게 수렴할때도 있어. 즉 프레임레이트가 변하는 순간에는 상당히 퍼포먼스가 불규칙하다. 그래서 moveLeave같은 것에 함부로 프레임을 낮추는 스크립트를 주면 돌아올때 복귀하면서 드드득하면서 애니메이션이 돌기 시작하는 등의 문제가 발생하지.
    유일하게 사고가 안나는건 getTimer()뿐이라 getTimer()기반으로 타이머클래스를 하나 만들어. 그럼 최저 수준의 정확성은 보장해. 정확하게 ms단위로야 안맞겠지만 프레임수준의 오차에서 작동할수는 있어.

    //1초마다 한번씩
    term = 1000;

    //다음 실행할 타이밍은 현재시간 + term;
    next = getTimer() + term;

    //일단 타이머를 만들고
    timer = new Shape;

    //엔터프레임에서
    timer.addEvent( enter, function enter( $e ){

     //현재시간이 next를 넘어가면
     if( next < getTimer() ){

      //리스너 실행하고
      listener();

      //다음 시간을 다시 리셋
      next = getTimer() + term;
     }
    } );

    위의 방식 정도가 그나마 프레임레이트 수준의 오차범위내에서 정확도가 가장 높을거야. 경험상 타이머보다는 훨씬 낫더라구.

    • Favicon of http://wooyaggo.tistory.com 우야꼬  2011.05.27 14:01 신고

      아 근데 형님이 제시해주신것도
      결국 fps 가 0.1인것처럼 낮을때는 효과가 없겠네요...
      ㅠ.ㅠ

  4. Favicon of http://diebuster.com hika 2011.05.28 00:12 신고

    그래서 애니메이션에 국한되서만 말하자면 난 걍 프레임레이트를 내리거나 조정할때 트위닝의 시간을 재계산해버려.
    대부분 0,1까지 낮출때는 비활성화잖아. 최소화든 포커스를 잃었든,
    그 순간 애니를 정지시키고 다시 활성화될때 정지된 곳부터 재생하도록 만들었어.
    결국 이징기반일테니까, 1초간 x가 100움직이는데 0.7초 진행되었을때 프레임레이트를 줄이면 그 상태를 보존하고 프레임레이트를 올릴때 다시 x=70->100 0.3초로 트위닝을 다시 거는거지.

  5. Favicon of http://codeonwort.tistory.com codeonwort 2011.06.20 18:10 신고

    stage.frameRate를 낮추는 대신, 저는 고해상도 타이머를 뺑뺑 돌리면서 이전 갱신과 현재 갱신 사이의 경과 시간을 계속 더하는데, speedRate라는 인자를 경과 시간에 곱한 후 더합니다. 게임에서는 타이밍 정확히 맞추는 게 중요해서 고안한 건데 이것도 가령 1초를 목표로 잡으면 오차가 0.1~0.2초 정도 나는 일이 다반사라 고생하고 있긴 해요.. -_-

    • Favicon of http://wooyaggo.tistory.com 우야꼬  2011.06.20 18:17 신고

      그렇게라도 해야될까봐요.
      테스트해야되는데 시간이 없네요 ㅠㅠ 대신 모듈 좀 만들어주세요 ㅋㅋ

  6. Favicon of http://codeonwort.tistory.com codeonwort 2011.06.20 19:42 신고

    완성을 못 했어요 --a 쓸 수는 있는데.. 네이트 메일로 보낼게요 봐주세요~

+ Recent posts