애니메이션 GIF 이미지를 표시하는 작은 응용 프로그램이 있습니다. GIF 프레임은 HBITMAP으로 저장됩니다. 나는 타이머를 설정하고 WM_TIMER 이벤트가 윈도우 프로 시저에서 발생할 때 bitblt 함수를 사용하여 애니메이션을 수행합니다. 그리고 타이머가 적절한 지연으로 설정되어 있지만 내 GIF 애니메이션은 브라우저에서 동일한 파일의 애니메이션보다 약간 느립니다. 문제는 타이머를 사용하여 작업을 수행하는 것보다 더 좋은 방법이 있거나 문제가 코드에있는 경우입니까?WinApi에서 애니메이션을 올바르게 수행합니까?
1
A
답변
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()를 호출하십시오.
관련 문제
- 1. winform에서 애니메이션을 어떻게 수행합니까?
- 2. Google 차트 애니메이션을 어떻게 수행합니까?
- 3. 내 UML 다이어그램을 올바르게 수행합니까?
- 4. 새로운 Ajax 데이터가 입력되면 애니메이션을 확인하고 수행합니까?
- 5. 팝업 뷰 컨트롤러에서 플립 애니메이션을 어떻게 수행합니까?
- 6. WinAPI에서 menustrip 만들기?
- 7. WinAPI에서 오디오 어댑터 열거하기
- 8. 이 경우 const_cast는 어떻게 올바르게 수행합니까?
- 9. Visual Studio 2012에서 올바르게 수행합니까? std :: move
- 10. iPhoto 09에서와 같이 플립 앤 성장 애니메이션을 어떻게 수행합니까?
- 11. WinApi에서 GetClientRect와 GetWindowRect의 차이점은 무엇입니까?
- 12. winapi에서 마지막으로 ShowWindow 상태를 가져옵니다.
- 13. WinApi에서 C# 펜과 브러시 사용?
- 14. iPhone의 내장 curlUp 및 curlDown 애니메이션을 사용하지 않고 페이지 컬 애니메이션을 어떻게 수행합니까?
- 15. javascript에서 슬라이딩 애니메이션을 올바르게 구현하는 방법은 무엇입니까?
- 16. 올바르게 UIScrollView에 애니메이션을 적용하는 방법 contentOffset
- 17. 로딩 애니메이션을 사용하여 div를 올바르게 차단하는 방법
- 18. 기본 Fusion Tables API : 업데이트 쿼리를 어떻게 올바르게 수행합니까?
- 19. WinApi에서 WM_TIMER msg를 순서대로 호출하는 방법?
- 20. 버튼을 누른 후 WinAPI에서 창 만들기
- 21. gadi 대신 winapi에서 텍스트 편집기를 작성
- 22. 네이티브 winapi에서 네이티브 와이파이 직접 사용하는 방법?
- 23. winapi에서 람다 함수를 사용하여 벡터 정렬하기
- 24. WinApi에서 HANDLE로 FILE *을 만드는 방법은 무엇입니까?
- 25. WinAPI에서 사용자 입력시 C++ 이미지 변경
- 26. winapi에서 모니터의 친근한 이름을 얻는 방법은 무엇입니까?
- 27. WINAPI에서 투명 버튼을 수행하는 올바른 방법
- 28. winapi에서 _tcstok_s를 사용하여 tchars를 구문 분석
- 29. winapi에서 편집 컨트롤의 텍스트를 가져올 수 없습니다.
- 30. 대신 WinAPI에서 유니 코드를 사용하는 이상한 문자
답장을 보내 주셔서 감사합니다.이 결함에 대해 알지 못했습니다. 여전히 timeBeginPeriod()를 사용하면 도움이되지 않습니다. 그렇다면 타이머가 올바른 접근법이며 문제가 코드에 있다고 가정해야합니까? –
물론 "운영 체제 버그"라고 가정하면 아무도 아무 것도 얻지 못합니다. –
전에 불공정 한 의견을 무시했지만 결국 해결책을 찾았 기 때문에 지금은 대답해야합니다. 불공평한데, 내가 생각한 적이 없거나 "운영 체제 버그"일 수 있다고 말했기 때문에, 접근법이 적절한지 아닌지에 대한 질문이있었습니다. 코드에서 일부 변경을해야하는지 아니면 다른 방식으로해야하는지에 대한 질문을 받았습니다. 다른 접근법을 사용해야합니다. 그리고 timeBeginPeriod() 함수는 SetTimer() 함수의 타이머에 영향을 미치지 않기 때문에 "아니오"였습니다. 대신에 CreateTimerQueueTimer() 함수로 만든 멀티미디어 타이머를 사용해야합니다. –