2012-02-13 1 views
2

나는 generative art 앱이 있습니다. 프레임 속도를 줄이지 않고 가능한 한 많은 사이클을 각 프레임마다 그려야합니다. 화면이 업데이트/새로 고침 될 때까지 남은 시간을 알려주는 방법이 있습니까?AS3 - 다음 프레임/스크린이 그릴 때까지의 시간

각 사이클에 걸리는 시간을 대략 밀리 초 단위로 계산하면 남은 시간이 평균 또는 피크 사이클 시간보다 짧을 때까지 사이클을 실행 한 다음 화면을 새로 고침 한 다음 다른 세트를 실행하십시오. 사이클.

+0

이것은 응용 프로그램을 실행중인 하드웨어에도 많이 달려 있습니다. –

+0

FPS를 화면에 출력하고 Event.RENDER를 사용하여 업데이트를 시도해보십시오. CPU, h 치 및 오류를 hog하기 시작하면 다른 하드웨어에서는 달라질 수 있습니다. – Neil

답변

4

, 당신은 1/N 초 동안 루프에서 그릴 수 *, N은 (당신이 얻을 및 설정할 수 있습니다) 단계의 프레임 속도는 일반적으로 :

import flash.utils.getTimer; 
import flash.events.Event; 

private var _time_per_frame:uint; 

... 어딘가 기본 생성자 :

stage.frameRate = 30; 
_time_per_frame = 1000/stage.frameRate; 
addEventListener(Event.ENTER_FRAME, handle_enter_frame); 

...

private function handle_enter_frame(e:Event):void 
{ 
    var t0:uint = getTimer(); 

    while (getTimer()-t0 < _time_per_frame) { 
    // ... draw some stuff 
    } 
} 
,
  • 이것은 다소 단순화 된 것이며 프레임간에 렌더링을 수행하는 데 약간의 시간이 필요하기 때문에 stage.frameRate에서 지정한 프레임 속도보다 느린 프레임 속도가 발생할 수 있습니다. 그러나 벡터 드로잉이나 화면에 도형을 추가하는 것과는 대조적으로 blits (화면의 비트 맵으로 그리기)하는 경우 위의 내용이 실제로 꽤 정확해야합니다.

느린가 원하는보다 프레임 속도의 코드의 결과는, 당신은 단지 플래시 렌더링하는 나머지 절반을 떠나, 프레임 절반 할당 된 시간을내어 같은 간단한을 시도 할 수있는 경우 :

_time_per_frame = 500/stage.frameRate; 

그리는 동안 프레임 속도를 모니터링하는 데 사용할 수있는 FPS 모니터가 있습니다. Google as3 framerate monitor.

+0

내 코드에이 원리를 적용하면 효과적입니다. 기본 아이디어 : 프레임의 시작 부분에서 시간을 가져온 다음 나중에 1 프레임 쯤 될 때까지 루프를 수행 한 다음 그립니다. –

0

이 코드를 주 개체에 넣고 확인하십시오. 각 프레임 시작 사이의 시간을 추적합니다. 당신이 N에서 실행할 수있는 앱이 초당 프레임하려면

addEventListener(Event.ENTER_FRAME , oef); 
var step:Number = 0; 
var last:Number = Date.getTime(); 
function oef(e:Event):void{ 
    var time:Number = Date.getTime(); 
    step = time - last; 
    last = time; 

    trace(step); 
} 
관련 문제