2011-05-07 2 views
4

'전통적인' C++ 배경은 flash.display API와 같은 것이 아닌 저수준 API를 처리하는 데 더 많이 사용됩니다.flash.display 깜박임을 피하는 방법

내 문제는 다소 기초적이지만 내 검색 결과는 해결책을 찾지 못했습니다.

디스플레이 API에서 화면이 끊어지지 않거나 깜박이지 않게하려면 어떻게해야합니까? 60fps와 같이 프레임 율이 높더라도 프레임간에 다소 불쾌한 깜박임/끊김이 발생합니다.

아래의 단순한 예를 예로 들어 보겠습니다. Sprite의 하위 항목은 단지 Shape의 인스턴스이며 변경되지 않습니다. 다른 사람들이 겉으로는 부드럽고 빠른 애니메이션을 할 수 있기 때문에

private function onEnterFrame(event:Event):void 
{ 
    var t:Number = (getTimer() - time)/1000; 
    time = getTimer(); 

    step(t); 
} 

private function step(t:Number):void { 
    var speed:Number = 100; 

    for (var i:uint = 0; i < numChildren; i++){    
     getChildAt(i).x += speed * t; 
     getChildAt(i).y += speed * t; 
    } 
} 

그러나, 나는 그것이 기본적으로 동기화 문제처럼 보이기 때문에 그것을 어떻게 사실에 관한 종류의 의아해 해요.

+2

http://stackoverflow.com/questions/989471/vsync-in-flex-flash-as3 – jedierikb

답변

1

첫 번째 : CPU가 더 필요 이상으로 힘들어 지므로 원활한 애니메이션을 위해서는 25/30 fps가 필요하므로이 속도로만 단계를 호출 할 수 있습니다. 스프라이트의 위치를 ​​업데이트하기 전에 x, y의 모양이 실제로 변경되고 변경된 경우에만 업데이트됩니다.

가능한 한 루프를 반복하십시오. numChildren (메서드 호출)을 루프 밖으로 가져옵니다. 속도 변수를 Number (정수) 대신 int로 변경

스프라이트를 살펴 봅니다. 투명도가 있습니까? 플래시는 각 프레임에 모든 레이어를 그려야하기 때문에 투명성은 성능 저하 요인입니다. 품질을 떨어 뜨리지 않고 가능한 한 작게 만드십시오 (스프라이트 크기로 축소 된 더 큰 이미지를 사용하는 경우).

+0

그런 최적화는 일종의 바보 일뿐 실제로 중요한 것은 블렌딩 및 서브 픽셀 정확도입니다. 그. 그리고 어쨌든이 문제를 다루는 사람은 아무도 없습니다. –

0

애니메이션 부드러움에 큰 영향을주는 wmode 매개 변수를 보았습니다. 동일한 swf는 독립형 플레이어와 다른 wmode가있는 html 페이지에서 다르게 작동합니다. 몇 가지 테스트를 마친 후에 wmode = "direct"를 선호합니다. "gpu"보다 더 매끄러운 동작을 제공합니다.

ActionScript 용 모니터링 도구 (예 : Stats)로 실제 fps를 보는 것이 좋습니다. 그것이 높게 유지되고 당신이 여전히 움직이지 않는 움직임을 보게된다면 그것은 wmode 문제입니다. 그리고 성능이 한계가 아니라면 60fps가 30보다 좋습니다. 왜 사용하지 않을까요?

+0

ofc를 게시하기 전에 Mr.Doobs Stats를 사용하여 벤치마킹을 했습니까? 그리고 실제 swf는 위의 게시 된 예제와 같이 단순합니다. 이 문제는 성능이 좋지 않지만 동기화 할 수있는 방법이 없다는 사실 때문에 다른 프레임 중간에 프레임이 찢어져 찢어지는 결과를 가져옵니다. –

+1

wmode에 따라 성능이 문제라고 여기지 않았으며, 그냥 swf가 부드럽게 재생되는 것을 보았습니다. 심지어 독립 실행 형 Flash Player조차도 최상의 성능 환경이 아니 었습니다. – alxx

관련 문제