Windows Tier Queues를 사용하여 Windows GDI에서 초당 프레임 수를 높이려고합니다. 관련 API는 CreateTimerQueue, DeleteTimerQueueEx, CreateTimerQueueTimer,
및 DeleteTimerQueueTimer
입니다.타이머 대기열은 즉시 타이머를 종료합니까?
타이머는 약 50fps의 속도를 달성하기 위해 CreateTimerQueueTimer(&m_timer, m_timer_queue, TimerCallback, this, 0, 20, WT_EXECUTEINTIMERTHREAD);
을 사용하여 생성됩니다. GDI 작업 (백 스토어의 일부 그림과 InvalidateRect)은 비동기 적이 지 않으므로 다른 플래그를 선택할 수는 없지만 WT_EXECUTEINTIMERTHREAD를 사용하여 그리기 코드에 추가 동기화 연산이 필요하지 않습니다. 가능한 경우 50fps를 달성하는 것이 아이디어이며, 그렇지 않은 경우 각 프레임을 가능한 최대 속도로 표시하십시오.
애니메이션이 끝날 때 (총 프레임 수에 도달) DeleteTimerQueueTimer
이 호출되어 타이머가 삭제됩니다.
DeleteTimerQueueTimer
은 즉시 콜백 기능의 호출을 끄지 않습니다. 50fps 요구 사항을 달성 할 수없는 경우 타이머는 호출을 대기열로 보내줍니다. 콜백 함수 내에 DeleteTimerQueueTimer
을 호출해도 대기열이 삭제되지 않습니다. 결과적으로 콜백은 타이머를 종료하기로 결정 했음에도 여전히 호출 중입니다.
이 문제는 어떻게 해결합니까?
- 또 하나의 오래된 timeSetEvent/timeKillEvent
멀티미디어 API에는이 문제가없는 것 같습니다. 대기열이 없으며 timeKillEvent를 호출하면 콜백 함수 호출이 즉시 중지됩니다. 타이머 대기열에서 동일한 동작을 수행 할 수 있습니까?
고마워,하지만 어떻게 멀티미디어 타이머 API 가이 문제가 없어? 어떤 종류의 간격이 "너무 자주"아닌가? "while (1)"과 "QueryPerformanceCounter"가 멀티미디어 타이머 또는 타이머 대기열 타이머보다 훨씬 비싸지 않습니까? 지금까지 나는 타이머 큐 타이머가 거의 50fps의 콜백을 발생시키는 데 드는 비용이 들지 않으면 서, 멀티미디어 타이머는 단지 약간의 CPU 비용만을 요구한다는 것을 발견했다. –