2013-02-26 2 views
4

좋아요, 그렇기 때문에 타이머 기반 움직임이 FR보다 낫다고 들었습니다. V = V + n/60 초, 60fps가 아닌 60fps. 그들은 속도를 실제 속도로 내리고 FR 지연으로 감소시키지 않는다고 말했다. 그러나 제가 시도한 것처럼, 타이머는 실제로 전혀 신뢰할 수 없습니다. 내가 뭔가 잘못하고 있는거야? 원인 Timer (20,0)는 애니메이션이 진행됨에 따라 느려집니다. 따라서 클립에 과중 하중이 걸리면 아무런 차이가 없습니다. 타이머 나 FR에 상관없이 느려 집니까? 그래, 나는 매 초마다 새로운 모양을 만들 수있는 테스트 클립을 가지고있어 잠시 후에 꽤 많이 있었지만 타이머가 실제로 내 시계보다 느리게 진행되고 초가 길어진다. 그러나 타이머는 더 많은 두통이 필요한 추가 작업입니다. 그래서 가치가 없거나 잘못 사용 했습니까? (다른 기능을 사용하기 전에 우선 순위를 지정하지 않았습니까?)AS3 타이머 또는 프레임 속도

답변

4

예, SWF가 프레임의 길이보다 짧은 스테이지를 렌더링 할 수 있으면 둘 다 좋습니다. 그렇지 않은 경우 프레임 속도는 너는 그래. 이 큰 FPS를 원한다면 성능 향상을 위해 SWF를 조정해야합니다. 또한 타이머는 프레임 당 한 번 이상 이벤트를 발생시킬 수 없습니다. 실제로 SWF가 정상적인 시간 흐름과 경쟁 할 수없는 느린 PC에서 실행되는지 여부를 알지 못해서 프레임 시간 접근 방식이 일반적으로 더 좋다고 믿습니다.

당신의 경우, 나는 타이머를 떨어 뜨리고, 프레임 당 하나 더 많은 이벤트를 던지고, 그들의 이벤트가 비동기 적이기 때문에 크게 신뢰할 수 없습니다. 즉, 타이머 이벤트가 다음 프레임 전에 실행될 것이라고 일관되게 말할 수 없으며, 더 큰 간격 타이머 호스트 PC의 지체는 많은 플레이어에게 즐거움을 안겨줍니다. (나는 Pyro와 나의 오래된 PIII를 기억하는데,이 PIII는 시스템 시간을 사용하여 비트 타임을 기록했지만, 일단 공을 쏘면 속도를 높일 수 없었고, 애니메이션은 프레임 속도를 떨어 뜨릴만큼 무거웠으며, 시간 점수.) 타이머가 이미 프레임 당 약 한 번씩 이벤트를 실행 중이므로 빠를 수 없습니다.

+0

Actionscript의 모든 기능이 그대로 비동기식입니다. 니가 말하는 것은별로 의미가 없다. 미안해. –

+0

글쎄, 입력 프레임 이벤트는 프레임 당 한 번 발생하고 프레임은 Flash의 자연 시간 단위입니다. 나는 타이머가 한 프레임 당 하나 이상의 이벤트를 발생시킬 수 없다는 것을 의미하므로 그리는 것과 같은 타이머는 불필요합니다. 프레임 리스너와 카운터를 사용하여 더 잘 수행 할 수 있습니다. – Vesper

+0

Hehe, 플래시가 오히려 어리석은 게임을위한 것이지, 진지한 게임이 아니라는 것을 점점 더 알게되었습니다. 나는 AS3, 천재 ppl o_O – SherWood

2

AS3의 타이머는 실제로 신뢰할 만합니다. AS3의 타이머는 1000보다 작은 값을 가질 수 없습니다. 이것은 Adobe에서 공식적으로 문서화 한 것입니다. 1000ms 제한이있는 타이머에 대한 테스트를 수행 할 수도 있으며, 정확하지 않은 800-999ms 간격으로 무작위로 발사된다는 것을 알 수 있습니다.

프레임 제한/무료 응용 프로그램을 만들려면 더 나은 후보는 "getTimer"입니다. 전달 된 시간을 사용하여 올바른 시간을 계산 한 다음 프레임을 렌더링 할 수 있습니다. 이 프로젝트의 시계 클래스에서

봐는 : Realtime Clock

+1

확실히 u 값은 1000ms보다 낮을 수 있습니다. "공식 문서"가 무엇을 읽었는지 모릅니다. livedocs에서 : 주 : 20 밀리 초 미만의 지연은 권장하지 않습니다. 타이머 빈도는 초당 60 프레임으로 제한됩니다. 즉, 지연 시간이 16.6 밀리 초보다 짧으면 런타임 문제가 발생합니다. – Urosan

+0

나는 고쳐졌고, 나는 머리 속에 1 마이크로 초가 걸렸다. 고맙습니다. –

1

당신은 아무것도 잘못하지 않았다. 이상적이지는 않지만 플래시는 업데이트를 최대 프레임 속도로 제한합니다. 즉, Timer 이벤트가 정확하지 않습니다. 개인적으로, 나는 new Date().getTime()를 사용하여 현재 시스템 시간을 확인하는 프레임 기반 루프를 사용하여 어떤 시간에 민감한하는 경향이, 그래서 나는 같은 것을 사용하는 것이이 도움이 될 수 있습니다

private var lastFrameTime:Number = new Date().getTime(); 
private var now:Number; 

addEventListener(Event.ENTER_FRAME, frameTick); 

private function frameTick(e:Event):void { 
    now = new Date().getTime(); 
    V = V + n * (now - lastFrameTime) * 0.001; 
    lastFrameTime = now; 
} 
0

합니다.

public class Timer extends EventDispatcher 
{ 
    private var instance:int; 
    private var _interval:Number; 
    private var _updateInterval:uint; 
    private var _lastCount:int 
    private var _repeatCount:int; 
    private var _count:int; 
    private var _started:Boolean; 
    public function Timer(interval:Number,repeatCount:int=0) 
    { 
     _interval=interval; 
     _repeatCount=repeatCount; 
    } 

    private function checkTime():void 
    { 
     var curCount:int=int(currentTime()/_interval); 
     if(curCount<=_lastCount)return; 

     _lastCount=curCount 
     _count++; 

     dispatchEvent(new TimerEvent(TimerEvent.TIMER)); 

     if(_count==_repeatCount&&_repeatCount>0) 
     { 
      stop(); 
      dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE)); 
      _count=0; 
     } 
    } 
    public function start():void 
    { 
     if(_started)return; 
     _started=true; 
     instance = getTimer(); 
     _updateInterval=setInterval(checkTime,10); 

     _lastCount=int(currentTime()/_interval); 
    } 
    public function stop():void 
    { 
     _started=false; 
     clearInterval(_updateInterval); 
    } 
    public function reset():void 
    { 
     _count=0; 
     stop(); 
     start(); 
    } 
    private function currentTime():Number 
    { 
     if (instance == 0) 
     { 
      instance = getTimer(); 
     } 
     return (getTimer() - instance); 
    } 
    public function get currentCount():int 
    { 
     return _count; 
    } 
}