我是否在 WinApi 中正确执行动画

Am I performing properly an animation in WinApi?

本文关键字:执行 动画 是否 WinApi      更新时间:2023-10-16

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

WM_TIMER的准确性由 Windows 时钟中断率和 UI 线程的响应能力决定。 默认情况下,时钟每秒滴答作响 64 次,每 15.625 毫秒一次。 计时器永远不会比这更准确。 或者换句话说,如果你要求,比如说,10毫秒,那么你不会收到WM_TIMER消息,直到15.625毫秒过去。 同样,如果您要求 16 毫秒,则在 2 x 15.625 = 31.250 毫秒过去之前不会收到消息。

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

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