2013-10-02 3 views
1

애니메이션 GIF 이미지를 표시하는 작은 응용 프로그램이 있습니다. GIF 프레임은 HBITMAP으로 저장됩니다. 나는 타이머를 설정하고 WM_TIMER 이벤트가 윈도우 프로 시저에서 발생할 때 bitblt 함수를 사용하여 애니메이션을 수행합니다. 그리고 타이머가 적절한 지연으로 설정되어 있지만 내 GIF 애니메이션은 브라우저에서 동일한 파일의 애니메이션보다 약간 느립니다. 문제는 타이머를 사용하여 작업을 수행하는 것보다 더 좋은 방법이 있거나 문제가 코드에있는 경우입니까?WinApi에서 애니메이션을 올바르게 수행합니까?

답변

1

WM_TIMER의 정확도는 Windows 시계 인터럽트 속도 및 UI 스레드의 응답으로 결정됩니다. 시계는 기본적으로 초당 64 번, 15.625 밀리 초마다 한 번 틱합니다. 타이머는 결코 그보다 정확하지 않습니다. 즉, 10 밀리 초라고하면 15.625 밀리 초가 경과 할 때까지 WM_TIMER 메시지를받지 못합니다. 마찬가지로 16msec를 요청하면 2x15.625 = 31.250msec가 경과 할 때까지 메시지를받지 못합니다.

GIF 형식은 단위가 10 밀리 초인 프레임의 애니메이션 시간을 지정합니다. 그래서 그 자체만으로도 애니메이션이 의도 한 것보다 오래 걸릴 수 있습니다.

WM_TIMER의 정확도는 timeBeginPeriod()를 호출하여 변경할 수 있습니다. 10의 기간을 묻는 것은 논리적 인 선택입니다. 완료되면 timeEndPeriod()를 호출하십시오.

+0

답장을 보내 주셔서 감사합니다.이 결함에 대해 알지 못했습니다. 여전히 timeBeginPeriod()를 사용하면 도움이되지 않습니다. 그렇다면 타이머가 올바른 접근법이며 문제가 코드에 있다고 가정해야합니까? –

+0

물론 "운영 체제 버그"라고 가정하면 아무도 아무 것도 얻지 못합니다. –

+0

전에 불공정 한 의견을 무시했지만 결국 해결책을 찾았 기 때문에 지금은 대답해야합니다. 불공평한데, 내가 생각한 적이 없거나 "운영 체제 버그"일 수 있다고 말했기 때문에, 접근법이 적절한지 아닌지에 대한 질문이있었습니다. 코드에서 일부 변경을해야하는지 아니면 다른 방식으로해야하는지에 대한 질문을 받았습니다. 다른 접근법을 사용해야합니다. 그리고 timeBeginPeriod() 함수는 SetTimer() 함수의 타이머에 영향을 미치지 않기 때문에 "아니오"였습니다. 대신에 CreateTimerQueueTimer() 함수로 만든 멀티미디어 타이머를 사용해야합니다. –

관련 문제