首页 文章

C#中的Gif动画文件具有比它们应有的更低的帧速率

提问于
浏览
2

我的软件完成运行后,我有一个全屏加载页面,其中包括一个preloader gif文件....这就像一个Windows 8用于商店和地铁 .

但问题是,无论gif文件的fps和速度是多少,C#窗体都将显示相同的低fps .

我真的不知道该怎么做,因为我试图在互联网上寻找解决方案,但无论我遇到什么都不清楚或无关 .

我怀疑编译器忽略了我导入的gif文件中集成的fps . 但我不知道如何将fps设置为文件的内容,或者让IDE / Compiler忽略其对该文件的规则 . 请指教<3

这里是文件属性的链接我使用http://preloaders.net/en/search/windows%208从顶行中间的那个...它有75帧,其余的是原样...

我目前正在使用图片框控件将gif包含在我的项目中(在winform项目中)

1 回答

  • 9

    这是正常的事故,GIF以10毫秒为单位指定帧的显示时间 . 但是,默认情况下,Windows上的计时器对于低时间间隔不够准确 . 定时器由系统时钟中断更新,默认情况下每秒定时64次 . 为定时器提供不超过15.625毫秒的准确度 . 实际上,你的GIF将以2/3速度播放,给予或接受 .

    您可以通过启动其他程序(如Windows Media Player或Firefox或Chrome等浏览器)来更改结果 . 你会突然看到你的GIF以设计速度播放 .

    你必须做这些程序做同样的事情,改变时钟中断率以获得一致的回放速度 . 您需要对timeBeginPeriod进行pinvoke,传递10以将定时器精度提高到10毫秒 . 如果您的UI线程没有响应并且启动计时器太晚,您可能需要降低 . 当您不再需要播放时,请务必再次调用timeEndPeriod(),通常在FormClosed事件处理程序中 .

    Boilerplate代码:

    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            timeBeginPeriod(timerAccuracy);
        }
    
        protected override void OnFormClosed(FormClosedEventArgs e) {
            timeEndPeriod(timerAccuracy);
            base.OnFormClosed(e);
        }
    
        // Pinvoke:
        private const int timerAccuracy = 10;
        [System.Runtime.InteropServices.DllImport("winmm.dll")]
        private static extern int timeBeginPeriod(int msec);
        [System.Runtime.InteropServices.DllImport("winmm.dll")]
        public static extern int timeEndPeriod(int msec);
    }
    

相关问题