2013-10-02 11 views
1

我有一个小应用程序,显示一个动画GIF图像。 GIF帧保存为HBITMAP。我在窗口过程中发生WM_TIMER事件时,只需通过设置定时器并使用bitblt函数即可执行动画。尽管定时器设置为适当的延迟,但我的GIF动画比浏览器中同一文件的动画略慢。所以问题是,如果有更好的方法比使用定时器来完成这项工作还是存在问题在代码中?我是否在WinApi中正确执行动画?

回答

1

WM_TIMER的准确性由Windows时钟中断速率和UI线程的响应性决定。时钟默认每秒钟64次,每15.625毫秒一次。计时器永远不会比这更准确。换句话说,如果你要求,比如10毫秒,那么直到15.625毫秒已经过去,你将不会收到WM_TIMER消息。同样,如果你要求16毫秒,那么直到2 x 15.625 = 31.250毫秒已经过去,你才会收到消息。

GIF格式指定单位为10毫秒的帧的动画时间。这本身就足以让你的动画比预期的花费更长的时间。

您可以通过调用timeBeginPeriod()来更改WM_TIMER的准确性。要求10分钟是合乎逻辑的选择。完成后调用timeEndPeriod()。

+0

谢谢你的回答,我不知道这个故障。仍然使用timeBeginPeriod()没有帮助,我应该假设计时器是正确的方法,问题在于代码? –

+0

当然,假设它是一个“操作系统错误”,任何地方都不会得到任何人。 –

+0

我之前忽视了你的不公平评论,但我现在必须回答,因为我终于找到了解决方案。不公平,因为我从来没有想过或说过它可能是一个“操作系统错误”,所以问题是关于该方法是否正确,要求确定我是否必须对代码进行一些更改或以其他方式进行更改需要使用另一种方法。答案是“否”,因为timeBeginPeriod()函数不会影响SetTimer()函数中的计时器,所以必须使用多媒体计时器(例如由CreateTimerQueueTimer()函数创建的计时器)。 –